对象的优化
1,不能返回局部的或者临时对象的指针和引用
在函数里面返回临时对象的时候,返回类型不能是指针或者引用
2,函数调用,实参=》形参, 是初始化的过程
3,函数参数传递过程中,对象优先按引用传递,不要按值传递
4,函数返回对象的时候,应该优先返回一个临时对象,而不要返回一个定义过的对象
用临时对象拷贝构造一个新对象 Test t=Test(30), 相当于Test t(30)直接构造,且不用对临时对象的析构
Test GetObject(Test & t){
int val=t.getData();
/*
Test tmp(val);
return tmp; //这里可以被优化拷贝构造和析构
*/
return Test(val);
}
5,接收返回值是对象的函数调用的时候,优先按初始化的方式接收,不要按赋值的方式接收
Test t2=GetObject(t2); 这就跟Test t1 做一样的事情
6,右值引用
左值:有内存,有名字 右值:没名字(临时变量),没内存
无法将左值绑定到右值引用 int &&c=a;
不能将一个左值引用绑定一个右值 int & c=20;//20没名字 是右值
但是const int & c=20;是可以成立的/* int tmp=20; const int &c =tmp;*/
int &&d=20;可以右值绑定到一个右值引用上
一个右值引用变量,本身是一个左值 ,只能用左值引用
int &f=d成立 int&&f=d不能成立
右值引用参数的拷贝/赋值构造,直接通过修改指针mptr=str.mptr; 然后将原来的指针指控 str.mptr=nullptr;
相当于直接把资源给别人
7,vec .push_back可以有左值引用和右值引用
8,std::move(),移动语义,将左值强转成右值引用类型
-
CMyString& +&&=CMyString&
CMystring&& +&&=CMyString&&
函数模板的类型推演+引用折叠就可以有7的效果
-
std::forward(val); 类型的完美转发,根据定义识别出来本身是左值还是右值