C++ 运算符 重载

来源:互联网 发布:淘宝贷款还不起怎么办 编辑:程序博客网 时间:2024/05/24 03:04

期末了啊,大一就要结束了,之前高三复读的同学考了一个好成绩。可能要去我高三的理想学校苏州大学。啊。。。希望我能考研考上苏大把,现在说考研是不是有点早啊。这里写图片描述

运算符重载的方法是定义一个重载运算符的函数,所以运算符重载是通过定义函数来实现的。运算符重载实质上是函数的重载。

格式

函数类型 operator 运算符名称(形参表){  语句  }

operator 是关键字,是专门用于定义重载运算符的函数,例如 operator + 的意思是:对运算符+重载的函数,## 函数名就是 operator + ##

下面对运算符+重载,使之能用于两个复数相加。

class Complex {public:    Complex(){real =0;imag =0;}    Complex(double x,double y){real =x; imag =y;}    Complex operator +(Complex &c2);    void display();private:    double real;    double imag;    };Complex Complex::operator +(Complex &c2){return Complex(real+c2.real,imag+c2.real);}

重载的“基本法”

1.不能重载的5个运算符

. (成员访问运算符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)

2.重载不能改变运算符的运算对象的个数

3.不能改变优先级

4.不能改变运算符结合性

如=的结合性 从右到左 重载之后还是右到左

5.重载运算符的函数不能有默认的参数

6.重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)

7.用于类对象的运算符一般必须重载,但又两个例外,运算符=和&不必用户重载

1.=可以用于每一个类对象,可以利用他在同类对象中互相赋值。
2.& 地址运算符也不必重载,他能返回类对象在内存中的起始地址。

运算符重载函数作为类成员函数和友元函数

上面的实现复数相加的 operator是作为 成员函数的。
+应该有两个参数,但是在上例代码中只有一个形参表。因为有一个参数是隐含的,运算符函数是通过this指针隐式的访问类对象的成员,可以看到operator+访问了两个对象中的成员,一个是形参c2 另一个就是this指针指向的对象,this->real 就是 c1.real

//友元函数实现+的重载class Complex {public:    ……    friend Complex operator +(Complex &c1,Complex &c2);  //两个参数};Complex operator +(Complex &c1,Complex &c2){……;}

如果将运算符重载函数作为成员函数,他可以通过this指针自由的访问本类的数据成员,因此可以少写一个函数的参数吗,将双目运算符重载为友元函数时,由于友元函数不是该类的成员函数,因此杂志函数的形参列表中必须有两个参数,不能省略

1.C++规定,赋值运算符=,下标运算符[ ],函数调用符() 成员运算符 -> 必须作为成员函数
2。 流插入<<和流提取>> 、类型转换运算符(http://c.biancheng.net/cpp/biancheng/view/222.html)不能定义为类的成员运算符,只能作为友元函数
3.一般将单目运算符和复合运算符(+=,/=之类的)重载为成员函数
4.一般将双目运算符

总结:作为友元函数的:<< >> 和双目运算符以类型转换符
* 作为成员函数有单目运算符和复合运算符、赋值运算符=,下标运算符[ ],函数调用符() 成员运算符 ->*

重载<<和>>

有时候我们需要直接输出一个类对象,所以我们需要对它们重载。
函数形式
istream & operator >>(isream& ,自定义类 &);
ostream & operator >>(osream& ,自定义类 &);

重载运算符>>(<<) 的函数的第一个参数和函数的类型都必须是istream&(ostream&)类型(即istream(ostream)类对象的引用),第二个参数是要进行输入操作的类。因此,只能将重载>>和<<的 函数作为友元函数,而不能将他们定义为成员函数,如果将它们定义为成员函数,那么左侧的运算对象将是我们的类的一个对象,假设输入输出类是某个类的成员,则它们也必须是istrea或ostream类的成员。然而这两个类属于标准库,并且我们无法给标准库的类添加任何成员。

重载<<输出复数

class Complex{
public:
……
friend istram &operator<<(ostram&,Complex &);
……
};
ostream &operator<<(ostram &output,Complex & c)
{
return output;
}
`

原创粉丝点击