复制构造函数究竟是什么时候调用的?[复制]

When exactly is copy constructor called? [duplicate]

提问人:A J 提问时间:7/18/2022 更新时间:7/18/2022 访问量:98

问:

我有以下代码:

#include<iostream>
using namespace std;

class A{
private:
    int x;
public:
    A(){x=10;}
    
    A(int m){x=m; cout << "int m constructor" << m << endl;}
    A(A& a){cout << "copy constructor:"<<a.x<<"\n"; x=a.x;}
    A(A&& a){cout <<"move constructor:"<<a.x<<"\n"; x=a.x;}

};

int main(){
    A a(100);
    A b = a;

    A d = A(30);
    
}

输出以下内容:

int m constructor100
copy constructor:100
int m constructor30

我期待它输出

int m constructor100
copy constructor:100
copy constructor:30

因为调用了构造函数 ()。 但是编译器以某种方式优化了它? 也打印. 这里是否发生了一些编译器优化?A(30)A d = A(A(30))int m constructor30

C++ 初始化 复制构造函数

评论

0赞 wohlstad 7/18/2022
你的最后一行()实际上是直接初始化的(不需要创建一个临时的,然后复制构造/分配)。A d = A(30)d
0赞 PaulMcKenzie 7/18/2022
复制构造函数究竟是什么时候调用的?-- 每当编译器进行复制时。关于次数没有确切的答案,如果您使用不同的选项编译程序,则尤其如此。这就是为什么在编写用户定义的复制构造函数时,应该将其编码为没有副作用,没有复杂的“业务逻辑”等,因为您无法可靠地准确预测何时调用它。
0赞 Drew Dormann 7/18/2022
A d = A(30)被计算为好像是 ,因为 C++ 假定默认构造一个对象只是为了立即为其分配其他东西是没有好处的。A d(30)
0赞 pptaszni 7/18/2022
en.cppreference.com/w/cpp/language/copy_elision ;但你也应该实现分配操作,以在不同的场景中查看全貌。
0赞 Eljay 7/18/2022
构造函数中的副作用不能保证被执行,因为构造函数可以(从 C++17 及更高版本开始,必须)在冗余的地方省略。它不是“编译器优化”,因为它是语言的要求。

答:

0赞 Goswin von Brederlow 7/18/2022 #1

你的最后一行,是强制性的复制省略A d = A(30)A d = A(A(30))