C++ 编程经验深度总结:函数返回值与容器操作的 10 大实战技巧
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:158
- 发布: 2025-07-02 09:57
- 最后更新: 2025-07-03 08:00
C++ 编程经验总结
函数相关
-
函数返回为引用或者结构体的时候,注意返回的不能是局部变量,否则返回后可能造成内容访问异常
-
函数返回的引用或结构体,如果其中有指针,指针指向的内存地址应保证返回后仍然有效。后续需要手动释放相关的内存。
-
函数尽量不要凭空申请内存,然后返回数据。一般返回的内容由调用者管理,如果需要手动释放,需要调用者进行释放。需要返回复杂的结构数据时候,可以通过参数传递到函数体内,这样返回的数据生存期,依然由调用者进行管理。
-
函数返回复杂结构时候,可以使用智能指针,自动管理返回的数据内存。
-
函数可以直接返回对象,通过拷贝复制的方式,从函数内部return 的时候,复制到返回值返回(注意返回的为一个右值)。
-
函数可以返回一个对象的引用,注意此对象应该在堆内存。如果是栈内存,在函数体结束时候,此对象就会失效,导致引用一个未定义错误(返回的对象引用为一个左值)。
-
用一个变量接收(赋值)一个函数返回值的时候,其实相当于对函数的返回的对象进行一次拷贝构造。例如:int a = func(),相当于将 func 的返回值(可能是左值也可能是右值)进行拷贝,即a 进行拷贝构造,参数是func 的返回值。
-
使用智能指针时候,最好从开始就生成只能指针,尽量不要用智能指针的内置指针进行操作,以免造成指向对象的释放,使智能指针失效。
-
c++ 模板万能引用 传左值报错。
在C++中,万能引用(Uniform Reference)通常是指模板函数中使用
T&&作为参数类型,它可以匹配左值和右值。但是,当你在模板函数中使用万能引用时,传递一个左值给模板可能会导致编译错误。这个问题通常发生在模板推导过程中。当你将一个左值传递给一个模板函数,并且模板参数是一个万能引用(
T&&),模板推导会将该参数作为一个右值引用处理,因为左值到右值的转换是不允许的。这会导致编译错误,因为你不能将一个右值引用绑定到一个左值上。解决这个问题的一个常见方法是使用
std::forward。std::forward是一个模板函数,它在模板中保留了其参数的值类别(左值或右值)。这样,当你将一个左值传递给一个模板函数时,std::forward会保持这个参数为左值,而不会尝试将其转换为右值。 -
std::bind 的参数,如果有引用或者指针类型,需要开发者保证在(bind后的函数)调用时候,参数仍然有效。
容器相关
- vector 不能存储对象引用。因为 vector 是可以进行扩容或者对象移动的,在这过程中,势必会进行内部元素的赋值,而引用对象在第一次初始化之后就不可以再次赋值,所以,vector 内可以存放对象,或者对象的指针,而不能存储引用。同理,deque 也不能使用引用.