运算符重载知识点总结(1)

运算符重载就是对现有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

所谓重载,就是重新赋予新的含义。例如函数重载,就是对一个已有的函数赋予新的功能。

本质上,运算符重载就是函数的重载。重载运算符使具有特殊名称的函数,形式如下:

返回类型  operator运算符号(形式参数列表)
{
     函数体
}

operator后接需要重载的运算符,成为运算符函数。

运算符函数的函数名就是“operator运算符号”

例子:

class complex//复数类
{
    public:
       complex(double r=0.0,double i=0.0)//构造函数
       {real=r;imag=i;}
    private:
        double real;
        double imag;
};

将‘+’用于复数类的加法运算,运算符函数原型可以是:

complex operator+(const complex &a,const complex &b);

调用运算符函数的形式如下:

operator 运算符号(实参列表);

例如:complex c1(1,2),c2(3,4),c3;

           c3=operator+(c1,c2);

也可以写成c3=c1+c2;

重载运算符的规则

(1)C++绝大部分的运算符可以重载,不能重载的运算符有:

.   .*   ::   ?:   sizeof

(2)不能改变运算符的优先级、结合型和运算对象数目。

(3)运算符重载函数不能使用默认参数

(4)重载运算符必须具有一个类对象(或类对象的引用)的参数,不能全部是C++的内置数据类型。

(5)一般若运算结果作为左值则返回类型为引用类型;若运算结果要作为右值,则返回对象。

(6)重载运算符的功能应该与原来的功能一致。

将运算符重载为类的成员函数,一般形式为:

class 类名{ //类体 …… 返回类型 operator 运算符号(形式参数列表) {
函数体
} ……
};
class 类名{ //类体 …… 返回类型 operator 运算符号(形式参数列表); ……
}; 返回类型 类名::operator 运算符号(形式参数列表) {
函数体 }

当运算符重载为成员函数时,运算符函数的形式参数的个数比运算符规定的运算对象个数要少一个。原因是类的非静态成员函数都有一个隐含的this指针,运算符函数 可以用this指针隐式地访问类对象的成员,因此这个对象自身的数 据可以直接访问,不需要放到形参列表中进行传递,少了的运算对象就是该对象本身。

双目运算符重载为类的成员函数,形式如下:

返回类型 类名::operator op(const 所属类型 &obj2) {
…… }
前置单目运算符重载为类的成员函数,形式如下:
返回类型 类名::operator op() {
…… }
后置单目运算符重载为类的成员函数,形式如下:
返回类型 类名::operator op(int) {
……}
当运算符重载为友元函数时,运算符函数的形式参数的个数和运算 符规定的运算对象个数一致。
形式如下:
class 类名{ //类体 …… //友元声明 friend 返回类型 operator 运算符号(形式参数列表);
}; 返回类型 operator 运算符号(形式参数列表) {
函数体 }
1. 双目运算符重载为类的友元函数,形式如下:

返回类型 operator op(const 所属类型 &obj1,const 所属类型 &obj1) {
…… // obj1和obj2分别对应两个运算对象 }
2.前置单目运算符重载为类的友元函数,形式如下:
返回类型 operator op(const 所属类型 &obj) {
…… // obj对应运算对象 }
3. 后置单目运算符重载为类的友元函数,形式如下:
返回类型 operator op(const 所属类型 &obj,int) {
…… // obj对应运算对象 }

重载流运算符
用户自定义数据类型的数据,是不能直接用<<和>>来进行输入输 出的。如果想使用它们输入输出自定义数据类型的数据,就必须对 它们进行重载。
对<<和>>重载的函数是由标准库iostream规定的,形式如下:

ostream& operator <<(ostream& os,const 类类型 &obj) {
os<<…… //obj数据成员逐个输出 return os; //必须返回ostream对象
} istream& operator >>(istream& is,类类型 &obj) {
is>>…… }
之所以两个函数都返回流对象的引用类型,是因为无论流插入或是 流提取都需要连续输入或输出,如cout<<a<<b<<c;因此运算对象 应该能作为左值。
流插入和提取重载函数不能是类的成员函数,否则左运算对象就只 能是该类型的对象,就会出现如下的错误形式:
a<<cout 或者 a>>cin

如果想要支持正常的形式,则左运算对象就必须为ostream类型或 istream类型。

 重载类型转换运算符

 C++对基本数据类型既有隐式类型转换,又有显示类型转换,我们 可以通过构造单个参数的构造函数将指定数据类型隐式转换为类类 型:

Fraction(double d); 和 Fraction(const string& str); 

如果要将类类型显示地转换为其他数据类型,就需要重载类型转换 运算符。

类型转换运算符函数只能作为类的成员函数,因为转换的运算对象 是类的对象。例如:

Fraction::operator double() {
return (double)nume/deno; }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值