我知道复制构造函数是在三个实例上调用的
3.当函数按值返回对象时。
我有问题3 如果在返回对象值时调用复制构造函数,那么如果在函数中本地声明对象,它不会产生问题吗?
我的意思是复制构造函数是一个深复制构造函数,并将对象的引用作为参数
它的调用正是为了避免出现问题。从本地定义的对象初始化一个作为结果的新对象,然后本地定义的对象被销毁。
对于深复制用户定义的构造函数,它们都是一样的。首先为将作为结果的对象分配存储空间,然后调用复制构造函数。它使用传递的引用来访问本地定义的对象并将所需内容复制到新对象。
复制在被调用函数退出之前完成,并将当时存在的局部变量复制到返回值中。
被调用的函数可以访问返回值将占用的内存,即使在进行复制时该内存不在“范围内”,它仍然可用。
根据我的问题的答案,复制构造函数甚至可能被调用两次:一次将本地对象复制到返回“对象”上,一次将返回对象复制到分配给它的变量上。
但是,它不需要! 编译器可以优化这两种复制结构。
不,它在当地人被摧毁之前调用它。 您可以使用记录破坏和复制构造的对象来测试这一点,或者通过查看生成的汇编代码来测试。
https://godbolt.org/z/W65K5GbGn
看起来返回对象值时不会调用复制构造函数。
https://en.cppreference.com/w/cpp/language/copy_elision
C++11/14 允许编译器执行复制省略,但不保证。从 C++17 开始,我们保证复制省略。