首页 理论教育 重载赋值操作符的实现方法

重载赋值操作符的实现方法

时间:2023-08-20 理论教育 版权反馈
【摘要】:运行结果如图9.1.7所示:图9.1.7对象的赋值我们可以看到,在main()函数中,我们用赋值操作符“=”把myclass1赋值给了myclass2。运行结果如图9.1.9所示:图9.1.9赋值操作符表示的初始化这个示例与之前讲变量初始化时的一种格式类似,myclass2并没有调用带一般参数的构造函数,而是直接经由赋值运算符自动调用了复制构造函数。

重载赋值操作符的实现方法

在讲解什么是重载赋值操作符之前,我们先来看一个示例:

动手写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并没有调用带一般参数的构造函数,而是直接经由赋值运算符自动调用了复制构造函数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈