前言

😋本文主要讲述C++中关于函数重载和运算符重载的一些基础知识。

🎡系统的梳理一下C++的相关知识,为后面的知识打下基础。

🧶重载提高了C++代码的复用性,节省了我们大量时间精力。

(从本文开始使用C++的输出输出方式,即iostream头文件定义的方式)

函数重载

🎡函数重载是指在同一个作用域内定义多个函数名相同形参不同的函数,即同名函数实现不同函数功能。

❗注意!必须是参数不同才可以重载(参数不同可以是个数、类型、顺序不同)。

下面通过一个例子说明函数重载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>

using namespace std;

void judge(int a); //参数int类型
void judge(double a); //参数double类型

int main()
{
judge(1); //传递一个int类型的参数
judge(1.0); //传递一个double类型的参数

return 0;
}

void judge(int a)
{
cout << "参数是一个int类型的变量" << endl;
}

void judge(double a)
{
cout << "参数是一个double类型的变量" << endl;
}

运算符重载

🎡在C++中,加号通常用来计算两个数的和。

🍗而在string中,两个字符串对象可以使用“+”进行相加。

🎁这就是运算符重载的应用,通过运算符重载可以给符号指定不同的含义。

运算符重载的定义

🎁运算符重载本质是函数重载

运算符重载的定义格式:

1
2
3
4
类型说明符 operator 运算符(参数列表)
{
函数体 //实现运算符功能
}

🎁运算符的操作对象不能全部为基本数据类型,至少一个是自定义的类对象。

🎡这五个常用运算符不允许重载:成员访问(.)、成员指针(*)、域(::)、条件(?:)、sizeof运算符。

运算符重载方式

运算符重载有两种方法:

  • 重载为类的成员函数
  • 重载为类的友元函数

重载为类的成员函数

双目运算符重载

🎡双目运算符即有两个操作对象,比如加减乘除。

调用重载运算符的格式:

1
左操作数 运算符 右操作数

编译器解释为:

1
左操作数.operator 运算符(右操作数)

下面,通过一个例子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

using namespace std;

class Book
{
public:
string name;
int price;
bool operator >(Book book); //声明>运算符重载,参数是Book类型对象,返回bool类型
};

bool Book::operator >(Book book) //定义运算符重载
{
return this->price > book.price; //判断左操作数是否大于右操作数
}

int main()
{
Book book1 = { "图书1", 100 }, book2 = {"图书2", 200}; //初始化两个Book对象

cout << (book1 > book2) << endl; //判断book1和book2的价格
cout << (book2 > book1) << endl;

return 0;
}

输出结果:

1
2
0
1

✨直接对自定义类的对象使用>操作符是没有意义的,我们重定义了这个操作符,使两个Book对象比较返回价格比较的结果。

🎃例子里使用了this指针,前面有所提及,编译器会自动为成员函数增加一个参数,this指针,它指向当前对象,即左操作数

单目运算符重载

🍗单目运算符只有一个操作数,如自增运算符。

🎃单目运算符有前置运算符后置运算符两种。

前置运算符

🎡前置运算符没有参数调用对象就是操作数。

下面通过例子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>

using namespace std;

class Book
{
public:
string name;
int price;
Book operator ++(); //声明前置运算符++重载,没有参数
};

Book Book::operator ++() //定义运算符重载
{
this->price++; //当前对象价格自增
return *this; //返回当前对象
}

int main()
{
Book book1 = { "图书1", 100 };

cout << (++book1).price << endl;
cout << book1.price << endl;

return 0;
}

输出结果:

1
2
101
101
后置运算符

🎃后置运算符有一个参数用于区分前置运算符,但是没有作用

下面通过例子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;

class Book
{
public:
string name;
int price;
Book operator ++(int); //声明后置运算符++重载,有一个参数用于区别,无实际作用
};

Book Book::operator ++(int) //定义运算符重载
{
Book temp = *this; //临时变量拷贝原对象
this->price++; //价格自增
return temp; //返回临时变量
}

int main()
{
Book book1 = { "图书1", 100 };

cout << (book1++).price << endl;
cout << book1.price << endl;

return 0;
}

输出结果:

1
2
100
101

重载为类的友元函数

🎡类的友元函数涉及类的封装,在后面的文章会讲到。

🎃这里不展开讨论,重载为类的友元函数即操作数都作为重载函数的参数

🍟一般情况下,双目运算符重载为类的友元函数,便于对两个操作数进行操作,并且可读性高,符合正常思维逻辑。

🎉而单目运算符通常重载为类的成员函数。此外,C++还限定了某些运算符必须重载指定类型的函数。感兴趣可自行查阅资料。

总结

😋本文介绍了函数重载和运算符重载的相关知识。

🎡运算符重载的本质是函数重载。

🧑以上仅仅是个人一些见解,难免会出现错误,还请指正。

🚩创作不易,本人保证所发文章均为精心筹备。

💌如需转载,请保留作者信息和博客地址。

📡如果感觉博客对你略有帮助,欢迎转发给你的朋友,让他们加入到技术风暴中来吧!