前言
本文介绍了C++中的对象优化,基于施磊老师的C++课程。
一、对象使用过程中调用的方法
注意点:
1、C++编译器对于对象构造的优化:用临时对象生成新对象的时候,临时对象就不产生磊,直接构造新对象即可;
2、使用指针指向临时对象会造成问题,因为这个语句结束之后临时对象就被析构了,指针成为野指针。但是可以使用常引用指向一个临时对象:
A *p = &A(); // 编译报错
const A &a = A(); // 编译正常
3、逗号表达式
class Test {
public:
Test(int a = 10, int b = 10) : ma(a), mb(b) {}
private:
int ma, mb;
};
// 这一句(50,50)是逗号表达式,等价于50,最后调用Test构造函数Test(50, 10)
t2 = (Test)(50,50);
一个简单的方法中函数调用流程:

二、总结三条对象优化的规则
1、函数参数传递过程中,对象优先按引用传递,不要按值传递
2、函数返回对象的时候,应该优先返回一个临时对象,而不要返回一个定义过的对象
3、接收返回值是对象的函数调用的时候,优先按初始化的方式接收,不要按赋值的方式接收

三、 带右值引用参数的拷贝构造和赋值函数
左值:有名字、有内存
右值:没名字、没内存
注意点:
1、左值引用不能引用右值,右值引用不能引用左值
2、常量左值引用可以引用右值,但缺点是不能修改
3、右值引用变量本身是一个左值
代码:
待补充
四、move移动语义和forward类型完美转发
move移动语义:将一个左值变量或者右值变量转换成右值,其底层通过static_cast实现:
/**
* @brief Convert a value to an rvalue.
* @param __t A thing of arbitrary type.
* @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
_GLIBCXX_NODISCARD
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
forward类型完美转发:由于右值引用变量都是左值,为了保持在函数调用过程中右值变量的右值属性,可以使用完美转发forward
3664

被折叠的 条评论
为什么被折叠?



