实例解释在重载赋值符时复制构造函数和无参构造函数的调用

#include<iostream>
#include<string>
//#define VNAME(x) #x;
using namespace std;
class Number {
public:
	int num;
	std::string name;
	Number(std::string _name = "nonPara", int n = 0) : num(n), name(_name){
		std::cout << "启动无参构造函数:" << name << std::endl;
	}
	// 在此处补充你的代码
	//Number& operator*(Number that){//如果返回Number&,必须用new, 不然Number(xxx,xxx)是在函数体构造的,一旦函数
	//	//结束就释放,等到赋值符运算时,传入的number& that是空便会出错
	//	return *(new Number("*creature", (this->num)*(that.num)));
	//}
	Number operator*(Number that){//因为返回Number,其实在乘法的调用过程会有:
		//1.Number that 对传入参数其实进行了复制构造
		//2.Return 构造了Number creature
		//3.返回类型是Number不是Number&,因而会调用复制构造,把creature进行复制后返回,看到分隔符上还是调用了creature->copyconstruction
		//即使n1*n2左边没有等于号,也会调用复制构造。

		return Number("*creature", (this->num)*(that.num));
	}
	Number(Number& a){//复制构造函数!!!的参数列表不能有Number类的对象,应该是number的引用
		//否则这里的传入参数是必须调用复制构造的,但是确没有在这之前定义复制构造
		num = a.num;
		name = "copyConstruction";
		std::cout << "启动复制构造函数" << a.name << " -> " << this->name << std::endl;

	}
	Number& operator=(Number& that){//特别注意,重载赋值函数的时候类的成员函数情况
		//下应该是返回自己,因为作为成员的操作符函数,第一个传入参数为(被省略)this指针
		std::cout << "调用赋值函数:" << this->num << that.name << " -> " << this->name << std::endl;
		//从这里可以看到:其实重载赋值函数是先启用无参数构造产生了this这个对象,然后再采用=
		this->num = that.num;
		return *this;
	}
	//friend int int(Number a); 
	operator int(){
		return num;
	}
};

int main() {
	Number n1("n1", 10), n2("n2", 20);
	n1*n2;
	std::cout << "我是分隔符-------------\n";
	Number n3("n3"); n3 = n1*n2;//n2会调用了复制构造
	cout << int(n3) << endl;
	system("pause");
	return 0;
}
//输出结果
//启动无参构造函数:n1
//启动无参构造函数:n2
//启动复制构造函数n2 -> copyConstruction               乘法传入参数类型为Number,不是引用,因此调用复制构造
//启动无参构造函数:*creature                           乘法的return 构造,构造体只存在在函数体内
//启动复制构造函数*creature -> copyConstruction        返回类型为Number,需要复制出来
//我是分隔符-------------
//启动无参构造函数:n3
//启动复制构造函数n2 -> copyConstruction
//启动无参构造函数:*creature
//启动复制构造函数*creature -> copyConstruction
//调用赋值函数:0copyConstruction -> n3
//200


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值