C++的copy构造函数调用次数的问题
迷茫
迷茫 2017-04-17 12:09:21
[C++讨论组]

原来在debug模式下也开了RVO,所以只调用了一次

class A {
public:
    A() {
        cout << "default constructor" << endl;
    }
    A(const A&) {
        cout << "A(const A&)" << endl;
    }
    A& operator=(const A&) {
        cout << "operator==" << endl;
        return *this;
    }
};

A getA() {
    A a;
    return a;
}

A& getAR() {
    A a;
    return a;
}

int main() {
    // A() -> A(const A&) -> A(const A&)
    cout << "getA()" << endl;
    A a = getA();
    // A() -> A(const A&)
    cout << "getAR()" << endl;
    A b = getAR();
    // A(const A&)
    cout << "Copy Test" << endl;
    A c = b;
}

主要疑问是第一个测试,我的想法是调用2次copy构造函数,一次是返回临时值的copy构造,还有一次是用返回的临时变量初始化a时候的copy构造,但为什么输出只有一次。
我在vs2015的debug模式下运行。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
天蓬老师

没看到你的代码有验证copy构造函数的地方(比如 A b(a)这种),用的都是operator=的版本。

其二,这样的代码很有问题:

A& getAR() {  
    A a;
    return a;
}

返回值是一个引用,而它却引用一个函数内的临时对象a,一般情况下外面使用这个引用会导致程序直接崩溃,幸运的话,编译器会帮做点事情而不会崩溃。

A b = getAR();
这句代码的问题在于:你的意图太模糊。如果你想构造一个全新的对象b,应该这样写:
A b(getAR());

如果你想创建一个引用,那么应该这样写:
A &b = getAR();
要保证getAR()返回的是一个指向有效对象的引用,非函数内临时的,否则的话,如上所述,继续使用b会导致崩溃。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号