操作符重载

Posted 早杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作符重载相关的知识,希望对你有一定的参考价值。

一.不能被重载的操作符

?: C++中无定义一个三目运算符的语法

.      安全性

*     安全性

:: 该操作符左边是一个类型名,不是一个表达式

 

二.<返回值类型> operator <运算符> (<形式参数表>)

1.重载一个一元操作符,其函数不需要任何参数

2.操作符重载,不改变优先级和结合性

3.重载不改变操作符的语法

4.一元重载仍是一元,二元重载仍是二元

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Pair
 5 {
 6 public:
 7     Pair(int x, int y)
 8     {
 9         p1 = x; p2 = y;
10     }
11     
12     bool operator==(const Pair &p)
13     {
14         return p1 == p.p1 && p2 == p.p2;
15     }
16 
17 private:
18     int p1, p2;
19 };
20 
21 
22 int main()
23 {
24     Pair s1(1, 2), s2(2, 3);
25     cout << boolalpha << (s1 == s2) << endl;//false
26     return 0;
27 }

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Complex
 5 {
 6 public:
 7     Complex()
 8     {
 9         real = 0;
10         imag = 0;
11     }
12     
13     Complex(double r)
14     {
15         real = r;
16         imag = 0;
17     }
18 
19     Complex(double r, double i)
20     {
21         real = r;
22         imag = i;
23     }
24 
25     Complex operator+(const Complex &c) const
26     {
27         Complex s;
28         s.real = real + c.real;
29         s.imag = imag + c.imag;
30         return s;
31     }
32 
33     Complex operator-(const Complex &c)
34     {
35         Complex s;
36         s.real = real - c.real;
37         s.imag = imag - c.imag;
38         return s;
39     }
40 
41     double real, imag;
42 };
43 
44 
45 int main()
46 {
47     Complex s1(1, 2), s2(2, 3);
48     Complex s = s1 + s2;
49     cout << s.real << " " << s.imag << endl;//3 5
50     return 0;
51 }

 

三.用顶层函数进行操作符重载

1.以顶层函数进行操作符重载必须在它的参数表中包含一个类对象,new, new[], delete, delete[]除外。没有类对象,如:void operator%(float f1, float f2)//error,x % y不能区别%是内建操作符还是用户定义的。

 

2.对于成员函数重载二元操作符,只需要一个参数。对顶函数需要2个。

[], =, ()(函数调用操作符), ->必须以类成员函数重载

void operator[](int i, Point &s);//error

因为9[x], 6.2 = x是不允许的

 

3.

 

1 Complex operator+(const Complex &c) const{......}
2 
3 Complex a, b(4.3, -8.2);
4 a = b + 54.3;//ok,转型构造
5 a = 54.3 + b; //error,54.3.operator+(b)

 

1 Complex operator+(const Complex &c, const Complex &b) {......}
2 
3 Complex a, b(4.3, -8.2);
4 a = b + 54.3;//ok
5 a = 54.3 + b; //ok

 

 

4.顶层:非对象操作数可出现在操作符左边

   类成员函数:第一个操作数必须是类对象

 

5.可把顶层函数设成类的friend

 

四.friend

类的friend函数可以访问私有成员和保护成员,但不是类的成员函数

建议仅在重载操作符时使用friend

1.friend函数可以是另一个类的成员函数

 

 1 class Date;
 2 
 3 class Time
 4 {
 5 public:
 6     void display(){}
 7 };
 8 
 9 class Date
10 {
11     friend void Time::display();
12 };

 

 

 

2.友元类

 

1 class A{};
2 
3 class B
4 {
5     friend A;
6 };

 

A是B的友元类,类B所有的成员可以被A访问

 

五.friend是单向的,friend不能传递,不能继承

 

以上是关于操作符重载的主要内容,如果未能解决你的问题,请参考以下文章

JAVA怎样重载操作符?

操作符重载

想问大佬++操作符重载,前置和后置的问题?

重载[] int& operator[ ]( )

31课.完善的复数类

智能指针