看网上与书上说的,是调用了?
但本人本人验证了一下。发现有问题啊?
但本人本人验证了一下。发现有问题啊?
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…这种)才是必须的)。