C++的copy构造函数调用次数的问题

浏览:55日期:2023-06-04

问题描述

原来在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会导致崩溃。

相关文章: