在讲解什么是重载赋值操作符之前,我们先来看一个示例:
动手写9.1.6
动手写9.1.6展示了对象的赋值。运行结果如图9.1.7所示:
图9.1.7 对象的赋值
我们可以看到,在main()函数中,我们用赋值操作符“=”把myclass1赋值给了myclass2。对于基本数据类型来说赋值操作就是将右值给到左值,而对于对象来说就是把所有成员的值复制到左值的对象中去。这一行为与复制构造函数类似,我们也要考虑是否需要深复制。而它们之间的区别在于复制构造函数发生在对象生命周期的一开始,给予对象的是初始值,而赋值操作符则是一项一项地覆盖重写对象原有的成员值。
此外,一些读者可能会对操作符的重载感到奇怪,觉得好像重载就是函数的特性。其实操作符也可以看作是一种函数,都是可以在类中重载的,毕竟把用户自定义类型当作基本类型一样相加相减,也是十分便利直观(本书在一开始就有关于字符串相加的内容介绍),在后面的一个小节中我们会详细介绍这一特性。
接下来就让我们来看看赋值操作符重载具体是如何实现的。
动手写9.1.7
(www.xing528.com)
动手写9.1.7展示了赋值操作符重载,运行结果如图9.1.8所示:
图9.1.8 赋值操作符重载
在一开始,myclass2的comp的val值是2,在赋值之后变成了与myclass1相同的1,而compPtr的地址不变。这一点与复制构造函数有些不同,因为赋值时是赋值给一个本来就存在的对象,所以也没必要重新分配内存,而只需要按成员逐个赋值,并对指针指向的成员对象的成员也重复赋值操作即可。在这里由于Component没有指针,我们在赋值的时候(“*compPtr = *rhs.compPtr;”)直接使用了它合成的赋值操作符,就像合成的复制构造函数那样。
最后,我们再看一个特殊的示例:
动手写9.1.8
动手写9.1.8展示了一个看似是赋值,实际上却是复制构造函数的示例。运行结果如图9.1.9所示:
图9.1.9 赋值操作符表示的初始化
这个示例与之前讲变量初始化时的一种格式类似,myclass2并没有调用带一般参数的构造函数,而是直接经由赋值运算符自动调用了复制构造函数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。