首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2014-01-17 
求教:C++复制控制问题。。。求教各路神仙一个简单的类:class TestObj {public:TestObj()TestObj(const TestO

求教: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优化。。
栈上的对象能返回的(当返回类型为值类型),不要乱猜。。
就是注意不要在函数返回值为引用类型的时候返回局部对象就行了。

热点排行