现在的位置: 首页 > 综合 > 正文

[C++ Primer] 重载操作符与转换

2018年04月03日 ⁄ 综合 ⁄ 共 1965字 ⁄ 字号 评论关闭

1.    不能通过连接其他合法符号来创建任何新的操作符,例如试图定义一个operator**操作符以提供求幂操作是非法的;用于内置类型的操作符其含义不能改变,例如 int operator+(int, int)就是非法的;也不能为任何内置类型定义额外的新的操作符,例如不能定义接受两个数组类型操作数的operator+-----(数组时内置类型??)

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

2操作符重载后不再具备短路求值特性,不保证操作数的求值顺序,尤其是不会保证内置逻辑AND,逻辑OR,和逗号操作符的操作数求值。因此,重载&&,||或逗号操作符不是一种好选择。

3大多数重载操作符可以定义为普通非成员函数或类的成员函数,作为类的成员函数,其形参看起来比操作数数目少1,因为有一个隐含的this形参,限定为第一个操作数。一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员。

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

5输出操作符<<的重载:为了与标准库一致,操作符应接受ostream&作为第一个操作数,对类类型const对象的引用作为第二个操作数,并返回对ostream形参的引用

Ostream &

Operator <<(ostream& os,const ClassType &object)

{

       Os<<//…

       Return os;

}

IO操作符必须为非成员函数,例如,如果将该操作符定义为类的成员,左操作数将只能是该类类型的对象,

Sales_item item; item<<cout;

这个用法与为其他类型定义的输出操作符的正常使用方式相反如果想要支持正常用法,则左操作数必须为ostream,而定义为类的成员函数时,this限定为第一个操作数,由此产生矛盾。

6输入操作符>>的重载:第一个操作数是一个引用,指向它要读的流,并且返回同一个流的引用,第二个操作数是对要读入的对象的非const引用,该操作数必须为非const,因为输入操作符的目的就是将数据读入到这个对象中。

Istream &

Operator>>(istream & in,Sales_item& s)

{

       In>>s.isbn>>…

       Return in;

}

注意:输入操作符和输出操作符的区别在于:输入操作符必须处理错误和文件结束的可能性。

7.相等操作符:如果类定义了operator==也应该定义operator!=,这两者应该是相互定义,一个操作符完成比较对象的实际工作,而另一个只是调用前者。

8.下标操作符必须定义为类的成员函数,定义下标操作符时,一般需要定义两个版本,一个为非const成员并返回引用,另一个为const成员并返回const引用。

9.箭头操作符 必须定义为类成员函数,解引用操作符不要求定义为类成员,但将它作为成员一般也是正确的。

10.C++不要求将自增或自减操作符一定定义为类的成员,但是这样的操作改变了对象,所以更倾向于定义为类的成员。为了区分前缀式和后缀式操作符,后缀式操作符接受一个额外的(无用)int形参,使用后缀操作符时,编译器提供0作为这个形参的实参,尽管前缀式操作符也可以使用这个额外的形参,但通常不这样做,这个形参的唯一作用是将前缀式操作符和后缀式操作符区分开来。如:

CheckPtr& operator++();

CheckPtr& operator++(int);

11.调用操作符和函数对象:

重载函数调用操作符(必须声明为成员函数)

Struct asbInt {

       Int operator() (int val) {

              Return val<0?-val:val;

       }

};

Int I = -42;

AbsInt absObj;

Unsigned int ui = absObj(i);

尽管absObj是一个对象而不是函数,我们仍然可以“调用”该对象,定义调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。

12.转换操作符,定义将类类型值转变为其他类型值得转换,在类定义体内声明(自然必须是成员函数),在保留字operator之后跟着转换的目标类型,不能指定返回类型,并且形参表必须为空,而且转换操作符一般不改变被转换的对象,所以通常定义为const成员。

Class SmallInt {

Public:

       ….

       Operator int() const(return val;)

Private:

       Std::size_t val;

};

转换函数采用如下通用形式:

Operator type();

抱歉!评论已关闭.