c++学习(二)——重载操作符与转换

原创 2007年10月06日 20:06:00

把学习C++primer的感受写下来,哪怕是照着抄,也要慢慢吃透。发现瞪着两只眼睛看,效果就是眼球发酸,瞌睡,把笔动起来,对学习是有好处的。写的同时,脑子也会跟着思考。不瞌睡。妙法——从效率上讲还是比较快的。

重载操作符与转换

通过操作符重载,能够针对类类型的操作数定义不同的操作符版本。

一、重载操作符的定义 

重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。重载操作符具有返回类型和形参表,如下语句:

Sales_item operator+(const Sales_item&, const Sales_item&);

除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。函数调用操作符可以接受任意数目的操作数。

不能重载的操作符包括“::”,“.*”,“.”,“?:”

还有重载操作符必须具有一个类类型操作数。用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义。

// error: can not redefine built-in operator for ints

int operator+(int, int);

也不能为内置数据类型重定义加号操作符。

重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。

加强记忆:重载操作符必须具有一个类类型操作数。

操作符的优先级、结合性或操作数数目不能改变,不管操作数的类型和操作符的功能定义如何。

重载操作符并不保证操作数的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值。

重载这些&&、||或逗号操作符不是一种好的做法。

大多数重载操作符可以定义为普通非成员函数或类的成员函数。

作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。

重载一元操作符如果作为成员函数就没有显式形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时就有一个形参,定义为非成员函数时,有两个形参。

操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。

使用重载操作符可以隐式调用也可以显式调用。

调用成员操作符函数与调用其它任意函数一样:指定运行函数的对象,然后使用点或箭头操作符获取希望调用的函数。

重载操作符的设计

1、不要重载具有内置含义的操作符。

重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法,这些操作符具有有用的内置含义。如果我们定义了自己的版本,就不能使用这些内置含义了。

2、大多数操作符对类对象没有意义。

设计类的时候,应该确定要支持哪些操作符。

为类设计操作符,最好的方式是先设计类的公用接口。定义了接口之后,就可以考虑应将那些操作符定义为重载操作符。

3、符合赋值操作符

如果一个类有算数操作符或位操作符,那么提供相应的复合赋值操作符一般是一个好的做法。

4、相等和关系操作符

如果类定义了相等操作符,它也应该定义不等操作符。类用户会假设如果可以进行相等比较,则也可以进行不等比较。同样的规则也应用于其它关系操作符。

5、选择成员或非成员实现

为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序员没有选择,操作符必须是成员;在另一些情况下,有些经验原则可指导我们做出决定。

一些指导原则:

(1)赋值、下标、调用和成员访问箭头灯操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

(2)像赋值一样,复合赋值操作符通常应定义为类的成员。

(3)改变对象状态或与给定类型紧密联系的其他一些操作符,通常应定义为类成员。

(4)对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

 

C++学习笔记39——重载输入输出操作符

1,重载运算符综述 (1)不能定义自己的新运算符,只能对已存在的运算符重载; (2)C++中大部分运算符都能重载,但仍有5个例外:            . (成员访问运算符)    .*(成...

C++学习笔记42——重载操作符之箭头操作符

箭头(->)操作符,看起来很像二元操作符,左操作数是类对象,右操作数是类成员,即使如此,箭头操作符的重载函数是没有第二个形参的(第一个是隐含形参this),理解起来有点难度;  函数语句为:  a->...

C++学习笔记40——重载作符之算术操作符与关系操作符

1,概述 (1)如前一节所述,一般应将算术操作符和关系操作符定义为类的友元函数; (2)编译器不会默认合成算术操作符和关系操作符,所以你如果不定义这些操作符,就没有办法在类对象上使用它们,这一点与赋值...

C++学习笔记41——重载操作符之下标操作符

1,概述 (1)下标操作符operator[]必须定义为类的成员函数; (2)下标操作符用在赋值操作符左右两边时,均应表现正常。故其应返回引用。 (3)一般应该定义const与非const两个版...

C++学习笔记:为什么不要重载逻辑与和逻辑或&& || 操作符

理论知识: 1—&&和||是C++中非常特殊的操作符 2—&&和||内置实现了短路规则 3—操作符重载是靠函数重载来实现的 4—操作数作为函数参数传递 5—C++的函数参数都会被求值,无法实...

c++学习笔记(9.操作符重载)

本节知识点:

C++学习笔记9-操作符重载

1. 重载操作符必须具有一个类类型操作数 用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义: // error: cannotredefine built-in operat...
  • wzhiu
  • wzhiu
  • 2014年07月18日 09:16
  • 851

C++学习之友元函数,操作符重载

这是我写的第一个类,分数类型,虽然比较简单,但我犯的错也并不少,比方成员函数和全局函数打代码时总是搞混,输入负的分数时也出现各种变态的输出,还发现了一个以前不知道的知识点就是 a*1.0/b 和a/b...

C++学习笔记:数组的操作符重载(包括[]和=运算符)

此案例,实现了数组类的操作符重载,包含 [] 和 = 运算符。实现如下: 首先MyArray.h的代码: #include "stdafx.h" #include using namespac...

C++学习笔记--数组操作符重载

首先问一下,在使用了string类后我们还能像在C中使用下标来操作数组的元素吗?当然可以啦,因为C++会最大限度的兼容C的用法,依然能够用下标操作单个字符。 看下面一个逆序字符串例子: void r...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++学习(二)——重载操作符与转换
举报原因:
原因补充:

(最多只允许输入30个字)