用重载赋值运算符验证构造函数与“=”的关系

       众所周知,构造函数的众多隐式性质经常让人感觉到很意外。

       前段时间学习运算符的重载,对一些与构造函数相邻的“=”号打起了主意,今天决定用重载运算符的办法验证这些“=”究竟是构造函数的“邻居”(各自独立)还是“家人”(被编译器理解为构造函数的一部分)。试验代码如下:

#include <iostream>
using namespace std;
class Dog
{
public:
      Dog():itsAge(4) {cout<<"Dog Constructor/n";}
      Dog(int age):itsAge(age) {cout<<"Dog Constructor/n";}
      int GetAge() {return itsAge;}
//定义一个只传递itsWeight的重载赋值运算符 
      void operator=(Dog & rhs){itsWeight=rhs.itsWeight;}
private:
      int itsAge;
      int itsWeight;
};
int main()
{
//Alex
      Dog Alex;
      Dog Wang(3);
      Alex=Wang;
      cout<<"Alex is "<<Alex.GetAge()<<" years old./n";
//Tom 
      Dog Tom=Dog(3);
      cout<<"Tom is "<<Tom.GetAge()<<" years old./n";
//Bruce 
      Dog * Bruce=new Dog(3);
      cout<<"Bruce is "<<Bruce->GetAge()<<" years old./n";
     

     return 0;
}

 

运行结果如下:

Dog Constructor

Dog Constructor

Alex is 4 years old.

Dog Constructor

Tom is 3 years old.

Dog Constructor

Bruce is 3 years old.

 

在Alex身上发生的赋值是最常规的赋值,先分别构造了Alex和Wang两个Dog类实例, 再以Wang为Alex赋值,由于Dog类的重载赋值运算符被定义为只传递itsWeight,因此Wang的值为3的itsAge并未赋给Alex,Alex.itsAge仍为默认的4;

 

Tom被用来验证“默认构造函数=无名构造函数”这种形式的代码究竟是①调用了两次构造函数,然后将右边的对象赋值给左边;还是②只调用了一次构造函数。结果显示“=”右边无名Dog的itsAge传递到了左边,而我们定义的重载赋值运算符只能够传递itsWeight,可见此处的“=”并不是赋值运算符。我们还可以看到这句代码只调用了一次构造函数,且调用的是“=”右边的那种重载构造函数,把Dog Tom=Dog(3)看作Dog Tom(3)。

 

引入Bruce对本实验并无实际意义,只是为了说明类的指针与类的实例是两个不同的概念。Dog * Bruce=new Dog(3)实际的工作为先构造了一个itsAge为3的无名Dog实例,然后使用这一实例的地址对指针Bruce进行初始化。 注意:此处的“=”并非赋值运算符,编译器把这行代码理解为Dog * Bruce(new Dog(3))。 

 

这是我的第一篇技术类博文,见识粗浅,如有错误,欢迎指出。本人也是编程新手,欢迎交流。

 

 

 

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值