关于右值引用,这个技术是用于处理临时对象的析构问题。之前也考虑过临时对象的析构问题。考虑这么一个问题。
class House{
int* data;
House(){
this->data=new int[1];
}
House(const House & h){
this->data=new int[1];
this->data[0]=h.data[0];
}
~House(){
delete[] House;
}
}
House build(House h){
return h;
}
int main{
House h;
House s=build(h);
return 1;
}
编译:g++-c house.cpp -std=c++11 -o a
最终会输出几次构造函数?
在调用build时,之前按照我的理解在build传入参数时copy构造一次,返回后又copy构造一次。
相当与是这么一个过程
build(h)先生成hcopy,然后h copy再生成s(相当于s是hcopy copy),最后析构hcopy,这里相当与
hcopy基本上没有用处,相当于多了一次析构,多了一次析构,构造开销,其实一般情况下大家完全可以
想到hcopy可以赋值给s。因为hcopy相当于是一个临时对象,也就是一个右值!所以c++11提出解决方法如下:
class House{
int* data;
House(){
this->data=new int[1];
}
House(const House & h){
this->data=new int[1];
this->data[0]=h.data[0];
}
House(House&& h){
this->data=h.data;
h.data=NULL;
}
~House(){
delete[] House;
}
}
添加第3个构造函数后就是参数House&&那个后,
House s=build(h);
返回生成s时,不再会是调用copy构造函数,而是调用右值构造函数,不需要像copy构造函数一样去
重新分配内存,只要把临时对象的内存窃取过来就可以了!!!!
下面是一个完整例子,代码在github上载,https://github.com/NanYoMy/Right-Reference-
我的环境是fedora17,g++,记得编译时需要添加-std=c++11,不然会出错!