Code Bye

急! 求啊。 函数返回值是对象,是调用了拷贝构造函数

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

20

这个真的要看调试器的,到底该是多少取决于标准而不是手上的编译器(标准规定的是让编译器作者本人决定该不该调用拷贝构造函数,而且是允许“即使可能导致改变行为的副作用”的情况下仍然做优化。只有检查可否拷贝构造函数可访问性(public、private…这种)才是必须的)。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明急! 求啊。 函数返回值是对象,是调用了拷贝构造函数