实例解释在重载赋值符时复制构造函数和无参构造函数的调用
2016-11-26 13:49
387 查看
#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
相关文章推荐
- 显式调用构造函数时不能引用实例字段请解释为什么“显式调用构造函数时不能引用实例字段”
- 显式调用构造函数时不能引用实例字段请解释为什么“显式调用构造函数时不能引用实例字段”
- 以Point类为基础,定义一个平面中的Circle类: 1、 编写一个无参的构造函数; 2、 编写一个有参的构造函数; 3、 在主函数中调用无参的构造函数生成圆的实例c1,调用有参的构造函数生成圆的实
- js入门实例の构造函数\方法的定义和调用\原型对象
- 何时调用构造函数,复制构造函数,析构函数
- 以Point类为基础,定义一个平面中的Circle类: 1、 编写一个无参的构造函数; 2、 编写一个有参的构造函数; 3、 在主函数中调用无参的构造函数生成圆的实例c1,调用有参的构造函数生成圆的实
- Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例及配置文件具体解释
- js入门实例の构造函数/方法的定义和调用/原型对象
- 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类?
- 第十五讲:重载(实例补充之构造函数及普通方法,各自相互调用)
- 构造函数以及复制控制操作的调用时机
- 不调用构造函数而创建一个类型实例
- java:当父类无无参构造函数并且有其他构造函数时,子类不能调用默认构造函数
- C++中类的使用实例 (3中可能的构造函数调用)
- Class.forName java.lang.reflect.Constructor反射调用有参构造函数和无参构造函数的方法
- 构造函数的方法和属性会复制给实例,但是原型中的方法和属性都不存在于实例中
- 以Point类为基础,定义一个平面中的Circle类: 1、编写一个无参的构造函数; 2、编写一个有参的构造函数; 3、在主函数中调用无参的构造函数生成圆的实例c1,调用有参的构造函数生成圆的实例c2
- 以Point类为基础,定义一个平面中的Circle类: 1、 编写一个无参的构造函数; 2、 编写一个有参的构造函数; 3、 在主函数中调用无参的构造函数生成圆的实例c1,调用有参的构造函数生成圆的实
- js入门实例の构造函数\方法的定义和调用\原型对象
- 关于父类私有属性在子类构造函数中super调用的解释