C++中的函数重载和引用
一丶函数重载
1. 定义
函数重载式函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型的顺序不同)。
2. 函数重载的不同形式
函数重载根据定义,有三不同的书写形式: 1. 参数列表中参数的顺序不同 2. 参数列表中参数的个数不同 3. 参数列表中参数的类型不同
只要满足上述任一条件重载就会成立。
示例代码如下:
#include <iostream>
using namespace std;
//顺序不同
void FuncA(int a, char b)
{
cout << "void FuncA(int a, char b)" << endl;
}
void FuncA(char a, int b)
{
cout << "void FuncA(char a, int b)" << endl;
}
//参数个数不同
void FuncA(int a)
{
cout << "void FuncA(int a)" << endl;
}
//类型不同
void FuncA(char a)
{
cout << "void FuncA(char a)" << endl;
}
int main()
{
FuncA(1, 'a'); //调用 void FuncA(int a, char b)
FuncA('a', 1); //调用 void FuncA(char a, int b)
FuncA(1); //调用 void FuncA(int a)
FuncA('a'); //调用 void FuncA(char a)
return 0;
}
3. 函数重载的注意事项
- 返回类型不同和参数变量名不同不构成重载。
- 函数重载指的是在同一作用域下的同名函数,不同作用域下不构成重载。
- 不同命名空间在展开后下在调用时可能会出现因为函数相同而照成调用歧义的问题。
1. 返回类型不同和参数变量名不同不构成重载
代码如下展示:
#include <iostream>
using namespace std;
void FuncA(int a, char b)
{
cout << "FuncA(int a, char b)" << endl;
}
void FuncA(int c, char d)
{
cout << "FuncA(int a, char b)" << endl;
}
//int FuncA(int a, char b) //编译前就会报错
//{
// cout << "FuncA(int a, char b)" << endl;
//}
int main()
{
FuncA(1, 'a'); //编译时将报错
return 0;
}
运行的报错结果如下:
2. 函数重载指的是在同一作用域下的同名函数,不同作用域下不构成重载
代码如下展示:
#include <iostream>
using namespace std;
namespace bit1
{
void FuncA(int a, char b)
{
cout << "bit1's FuncA";
}
}
namespace bit2
{
void FuncA(char a, int b)
{
cout << "bit2's FuncA";
}
}
//不同命名空间(属于不同的作用域),即使满足重载条件也不构成重载关系
3. 不同命名空间在展开后下在调用时可能会出现因为函数相同而照成调用歧义的问题
代码如下展示:
#include <iostream>
using namespace std;
namespace bit1
{
void FuncA(int a, char b)
{
cout << "bit1's FuncA";
}
}
namespace bit2
{
void FuncA(int a, char b)
{
cout << "bit2's FuncA";
}
}
using namespace bit1;
using namespace bit2;
int main()
{
//FuncA(1, 'a'); //调用歧义 编译前就会报错
// 原因:
// 两个域bit1和bit2中有相同的函数
// 虽然可以同时存在 但在命名空间展开时调用会发生歧义
// 因为编译器无法通过参数列表的赋值来识别出FuncA究竟来自哪个域
return 0;
}
二丶引用
1. 定义
:引用就相当于是别名 一个变量可以有多个引用(别名)。 引用符号:& 其格式为:数据类型& 标识符 = 另一标识符
2. 引用的规则
- 引用须在定义时就指明实体(即定义时就要初始化初值)。
- 一旦指明实体后不可再更改实体对象(此处的更改指的是更换实体对象)。
代码示例如下:
#include <iostream>
using namespace std;
int main()
{
//引用须在定义时就指明实体(即定义时就要初始化初值)
//而且一旦指明实体后不可再更改实体对象
// (此处的更改指的是更换实体对象)
int x = 0;
//int& y; //编译前就会报错 语法错误
int& y = x;
int z = 1;
cout << "x = " << x << endl;
cout << " y = " << y << endl;
cout << "z = " << z << endl << endl;
y = z;
//当指明实体后 不会更改实体对象
//此处的y = z 意义不是将y变为z的别名
//而是引用y对应的值赋值为z的值
cout << "x = " << x << endl;
cout << " y = " << y << endl;
cout << "z = " << z << endl;
return 0;
}
3. 引用的具体意义
- 引用就相当于是别名 一个变量可以有多个别名(引用)
- 引用值和被引用值指向同一块空间
- 对引用的值的操作会修改被引用的值
代码示例如下:
#include <iostream>
using namespace std;
int main()
{
// 引用就相当于是别名 一个变量可以有多个别名(引用)
//如:
int a = 0;
int& b = a;
int& c = a;
int& d = a;
cout << "a = " << a << endl; // 0
cout << "b = " << b << endl; // 0
cout << "c = " << c << endl; // 0
cout << "d = " << d << endl; // 0
// 引用值和被引用值指向同一块空间
cout << "pa = " << &a << endl; //这4个内存的地址相同
cout << "pb = " << &b << endl;
cout << "pc = " << &c << endl;
cout << "pd = " << &d << endl;
// 对引用的值的操作会修改被引用的值
++d;
cout <<"a = " << a << endl; // 1
cout <<"b = " << b << endl; // 1
cout <<"c = " << c << endl; // 1
cout <<"d = " << d << endl; // 1
return 0;
}
4. 引用涉及的权限问题
权限放大和权限缩小
直接上代码说明:
#include <iostream>
using namespace std;
int main()
{
//1.权限放大
//m为const属性 即常量 而n作为m的引用时直接引用 未加const
//这就导致了权限的放大
// m作为常量 值不能修改 只能读取
//而n将m作为变量引用 变量既可以被读取 也可以被修改
// 相当于让引用n指向的空间也可以被修改
// 相当于放大了m的权限 这就导致可以通过n来修改常量m
// 这是不允许的
const int m = 0;
//int& n = m; //编译就会报错 语法错误
const int& n = m; //正确写法 平级引用 不放大也不缩小权限 保留原值的属性
//2.权限缩小
int x = 0;
const int& y = x;
//x为变量 可读可写(修改)
//y为常量引用 只可读
//y作为x的引用 允许读取x 但由于y本身的const属性当值不可修改x
//未放大x的权限 可行
return 0;
}
本博客仅供个人参考,如有错误请多多包含。
Aruinsches-C++初阶日志-3/29/2024