C++ - 函数重载和运算符重载

2023-12-13 18:13:06

1.函数重载

函数重载 (Overload)是 C++ 语言在C语言基础上新增的功能。函数重载能够在程序中使用多个同名的函数。是C++多态的特征体现。
通过函数重载来设计一系列的函数,它们完成相同或者相似的功能,但使用不同的参数列表。

函数重载的关键是函数的参数列表 (函数特征标)。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而与变量名无关。
C++允许定义名称相同的函数,条件是它们的特征标不同。如果参数数目、参数类型、排列顺序不同,则特征标也不同。

例:定义一组函数原型

void print(const char *str, int width); // #1
void print(double d, int width);        // #2
void print(long l, int width);          // #3
void print(int i ,int width);           // #4
void print(const char *str);            // #5

调用时:
print("hello",15);
print(10.0,2);
print(10L,2); 
print(10,2);
print("hello");

函数重载条件

  • 在相同的作用域下
  • 参数的个数、类型、排列顺序不同。
  • 函数的返回值不可以作为函数重载的条件。

C++有哪些函数不能重载

  • 析构函数
    析构函数不能重载 ,因为析构函数只能有一个,且不能带参数。析构函数是系统自动调用的,是没有参数表的。
  • main函数不能重载

2.运算符重载

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

可重载的运算符:
在这里插入图片描述
不可重载的运算符:

  • . 成员访问运算符
  • ., -> 成员指针访问运算符
  • :: 域运算符
  • sizeof 长度运算符
  • ?: 条件运算符
  • # 预处理符号

下标运算符重载函数只能定义成员函数,其形式如下:

返回类型 类名::operator[ ] (形参){
??//函数体
}

注意:形参在此表示下标,C++ 规定只能有一个参数。
例 1:使用下标运算符重载函数的例子

#include<iostream>
using namespace std;
class Vector4{
	private:
		int v[4];
	public:
		Vector4(int a1,int a2,int a3,int a4){
			v[0]=a1;v[1]=a2;v[2]=a3;v[3]=a4;
		}
		int &operator[](int bi);  //声明下标运算符 [] 重载函数 
}; 
int &Vector4::operator[](int bi){  //定义下标运算符 [] 重载函数 
	if(bi<0||bi>=4){    //数组的边界检查 
		cout<<"Bad subscript!\n";
		exit(1);
	}
	return v[bi];
}
int main(){
	Vector4 ve(0,1,2,3);
	cout<<ve[2]<<endl;  //ve[2] 相当于 ve.operator[](2)
	ve[3]=ve[2];  
	cout<<ve[3]<<endl;
	ve[2]=22;
	cout<<ve[2];
	return 0;
}

重载下标运算符“[ ]”时,返回一个 int 型的引用,可使重载的“[ ]”用在赋值语句的左边,因而在 main 函数中,ve[i] 可以出现在赋值运算符的任何一边,使编程更灵活。

参考:
[1]https://www.bilibili.com/video/BV1Rq4y1F77y/?spm_id_from=333.337.search-card.all.click&vd_source=7a4fcf1e79c6c978598c4f5c8e5dddf0
[2]http://t.csdnimg.cn/nANWh
[3]https://www.runoob.com/cplusplus/cpp-overloading.html
[4]https://blog.csdn.net/aaqian1/article/details/86440801

文章来源:https://blog.csdn.net/qq_46276154/article/details/134848604
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。