操作符重载

     重载的运算符是具有特殊名字的函数,名字由关键字operator和其后要定义的运算符号共同组成, 重载的运算符也包含返回类型,参数列表以及函数体。重载运算符函数的参数数量和该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数。

cout<<"abc"; 运算符为<<, cout 为第一参数,“abc”为第二个参数。

     如果一个运算符函数是成员函数,则它的第一个(左侧)运算对象绑定到隐式的this指针上。成员运算符函数的参数数量比运算符的运算对象总数少一个。运算符作用与内置类型的运算对象时,无法改变运算符的含义。int operator + (int, int ); 错误。对于运算符的使用: a+b, operator+ (a,b); 都调用了非成员函数operator +, a,b 为两个实参。 a+=b, a.operator+=b,对成员运算符函数的条调用。

 

输入输出符<<, >>

   通常情况,输出运算符的第一个形参是一个非  常量ostream 对象的引用。ostream 是非 常量是因为流写入内容会改变状态,形参是引用是因为无法直接复制一个ostream 对象。 第二个参数一般是一个常量的引用(是引用是为了避免复制实参)形参是常量是因为打印内容不会改变对象的内容。operator<< 一般要返回其ostream形参。

 

os 是第一非常量对象的引用。第二个参数是常量对象的引用。

输入输出运算符必须是非成员函数,  如果输入输出定义为成员函数,则左侧的运算对象要为类的对象。

sales_data data;

data<<cout; 

因此为类定义IO运算符时,必须将其定义为非成员函数。

 

算术运算符关系运算符:

一般将算术与关系运算符定义为非成员函数以允许对左侧或右侧的运算对象进行转换。 因为这些运算符一般不需要改变运算对象的状态,所以形参都是常量的引用。

相等运算符:

如果定义了==一般要定义!=,如果某个类在逻辑上有相等性的含义,则该类应该定义operator ==, 这样做使得用户更容易使用标准库算法来处理这个类。

关系运算符类似==

赋值运算符:

一般我们使用拷贝赋值或移动赋值运算符,但是我们也可以定义第三种赋值运算符,如在vector中,该运算符接受花括号内的元素作为参数: 

vector<string> V;

V={"a","an","the"};

同样可以把这个运算符添加到别的类中:

为了与内置类型的赋值运算符保持一致,新运算符将返回其左侧运算对象的引用。不论形参的类型是什么,赋值运算符都必须定义为成员函数。

 下标运算符:

posted @ 2017-06-30 04:20  hahahaf  阅读(154)  评论(0编辑  收藏  举报