C++Primer作者提到拷贝构造函数调用的三种时机:
1. 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值
2.函数形参是类对象
3.函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象
但是下列代码验证时发现 第三个返回值是对象时并没有调用拷贝构造函数
class ZooAnimal { public: ZooAnimal() : loc (1){} ZooAnimal(const ZooAnimal &lhs) { this->loc = lhs.loc; cout << "copy construct" << endl; } virtual ~ZooAnimal() { cout << "deconstructer" << endl; } virtual void rotate() { cout << "ZooAnimal" << endl; cout << loc << endl; } public: int loc; string name; }; ZooAnimal func() { ZooAnimal x; x,loc = 2; return x; } int main(int argc, char* argv[]) { func(); return 0; }
原因是在C++Primer的作者在《深度探索C++对象模型》一书中提到,编译器会进行优化,返回值在参数采用引用的方式
func优化为 ZooAnimal func(ZooAnimal &_hiddenArg) { hiddenArg.loc =1; return; }
g++ main.cpp -o test -fno-elide-constructors 可关闭优化
结果打印
copy construct
原文地址:https://www.cnblogs.com/dj0325/p/12013385.html
时间: 2024-10-14 13:21:39