跨域 ipv4 HTTP请求 状态模式 delphi pagination jvm vue使用教程 后台模板下载 当前线程等待5秒 matlab定义空矩阵 vm虚拟化引擎 python当前日期 python正则匹配数字 java编译环境 java开发接口 java程序 java中tostring方法 java多线程教程 java判断文件是否存在 java文件删除 wps2011 redis入门指南 路由器辐射大吗 忧思华光玉 wine模拟器 自动喊话器 谷歌地球用不了 拼多多商家下载 apihook oracle表分区 什么是人肉搜索 foobar2000插件 cad文件 倒计时定时器 图片文字提取软件 软媒u盘启动 强制换行快捷键 mysql嵌套查询 python游戏编程
当前位置: 首页 > 学习教程  > 编程学习

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

2021/1/9 2:17:55 文章标签: 无参构造函数

#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 << "启动无参构造函…

#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



本文链接: http://www.dtmao.cc/news_show_1100441.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?