看网上与书上说的,是调用了?
但本人本人验证了一下。发现有问题啊?
但本人本人验证了一下。发现有问题啊?
class Box { public: Box(){ this->num = 0;} Box(int num) { this->num = num; } Box(const Box& temp) { this->num = temp.num+100; } void show() { cout<<this->num<<endl; } int num; }; Box get() // 返回值是对象! 能否这时调用了拷贝构造函数? { Box box1(2); return box1; } int main(int argc, char *argv[]) { Box box; box = get(); box.show(); return 0; }
本人的疑问是:程序运行后应该打印几啊?
本人觉得:若是调用了拷贝构造函数,应该打印102啊?
解决方案
20
Box box;
box = get(); //你觉得这个等号还会调用复制构造函数吗?
原因是box这个对象已经存在了, 那肯定是不会调用复制构造函数了, 原因是对象box已经早就构造好了.
这里的等号实际上是 = 运算符重载了, 即赋值运算符重载.
你想调用复制构造函数, 那需要这么写:
Box box = get(); // 这里的=号是初始化, 假如有复制构造函数就会调用, 否则会使用memery copy.
box = get(); //你觉得这个等号还会调用复制构造函数吗?
原因是box这个对象已经存在了, 那肯定是不会调用复制构造函数了, 原因是对象box已经早就构造好了.
这里的等号实际上是 = 运算符重载了, 即赋值运算符重载.
你想调用复制构造函数, 那需要这么写:
Box box = get(); // 这里的=号是初始化, 假如有复制构造函数就会调用, 否则会使用memery copy.
20
这个真的要看调试器的,到底该是多少取决于标准而不是手上的编译器(标准规定的是让编译器作者本人决定该不该调用拷贝构造函数,而且是允许“即使可能导致改变行为的副作用”的情况下仍然做优化。只有检查可否拷贝构造函数可访问性(public、private…这种)才是必须的)。