读书人

C++复制控制有关问题。求教各路神仙

发布时间: 2014-01-17 15:01:00 作者: rapoo

求教:C++复制控制问题。。。求教各路神仙
一个简单的类:
class TestObj {
public:
TestObj();
TestObj(const TestObj& obj);
string str;
};

TestObj::TestObj() {
str = "hello";
cout << "create-->" << this << endl;
}

TestObj::TestObj(const TestObj& obj) {
str = obj.str;
cout << "copy-->" << str << endl;
}

测试代码:
TestObj test() {
TestObj o;
return o;
}

int main() {
TestObj o2 = test();
cout << &o2;
}

输出结果:
create-->0x28fef0
0x28fef0

请问:为什么没有调用copy构造,为什么输出的内存地址是一样的。。

[解决办法]
代码应该没什么问题。事实上,用函数返回值对xx赋值是应该调用拷贝构造函数的,可能是编译器做了优化。编译器经常会做这样的优化。
我用VS测试了下,的确输出:

create-->0014FAF4
copy-->hello
0014FC10

而gcc4.8输出跟楼主一样。

下面这种情况,会调用拷贝构造函数(g++4.8.1):
void cp_test(TestObj obj){
}
cp_test(o2);

[解决办法]
编译器优化掉了。c++11的Move构造标准化了这一做法。
[解决办法]
又是RVO优化+place优化。。
栈上的对象能返回的(当返回类型为值类型),不要乱猜。。
就是注意不要在函数返回值为引用类型的时候返回局部对象就行了。

读书人网 >C++

热点推荐