C++ 编程经验深度总结:函数返回值与容器操作的 10 大实战技巧

C++ 编程经验总结

函数相关

  • 函数返回为引用或者结构体的时候,注意返回的不能是局部变量,否则返回后可能造成内容访问异常

  • 函数返回的引用或结构体,如果其中有指针,指针指向的内存地址应保证返回后仍然有效。后续需要手动释放相关的内存。

  • 函数尽量不要凭空申请内存,然后返回数据。一般返回的内容由调用者管理,如果需要手动释放,需要调用者进行释放。需要返回复杂的结构数据时候,可以通过参数传递到函数体内,这样返回的数据生存期,依然由调用者进行管理。

  • 函数返回复杂结构时候,可以使用智能指针,自动管理返回的数据内存。

  • 函数可以直接返回对象,通过拷贝复制的方式,从函数内部return 的时候,复制到返回值返回(注意返回的为一个右值)。

  • 函数可以返回一个对象的引用,注意此对象应该在堆内存。如果是栈内存,在函数体结束时候,此对象就会失效,导致引用一个未定义错误(返回的对象引用为一个左值)。

  • 用一个变量接收(赋值)一个函数返回值的时候,其实相当于对函数的返回的对象进行一次拷贝构造。例如:int a = func(),相当于将 func 的返回值(可能是左值也可能是右值)进行拷贝,即a 进行拷贝构造,参数是func 的返回值。

  • 使用智能指针时候,最好从开始就生成只能指针,尽量不要用智能指针的内置指针进行操作,以免造成指向对象的释放,使智能指针失效。

  • c++ 模板万能引用 传左值报错。

    在C++中,万能引用(Uniform Reference)通常是指模板函数中使用T&&作为参数类型,它可以匹配左值和右值。但是,当你在模板函数中使用万能引用时,传递一个左值给模板可能会导致编译错误。

    这个问题通常发生在模板推导过程中。当你将一个左值传递给一个模板函数,并且模板参数是一个万能引用(T&&),模板推导会将该参数作为一个右值引用处理,因为左值到右值的转换是不允许的。这会导致编译错误,因为你不能将一个右值引用绑定到一个左值上。

    解决这个问题的一个常见方法是使用std::forwardstd::forward是一个模板函数,它在模板中保留了其参数的值类别(左值或右值)。这样,当你将一个左值传递给一个模板函数时,std::forward会保持这个参数为左值,而不会尝试将其转换为右值。

  • std::bind 的参数,如果有引用或者指针类型,需要开发者保证在(bind后的函数)调用时候,参数仍然有效。

容器相关

  • vector 不能存储对象引用。因为 vector 是可以进行扩容或者对象移动的,在这过程中,势必会进行内部元素的赋值,而引用对象在第一次初始化之后就不可以再次赋值,所以,vector 内可以存放对象,或者对象的指针,而不能存储引用。同理,deque 也不能使用引用.