前言:
当前小伙伴们对“c语言重载”都比较注重,我们都需要学习一些“c语言重载”的相关文章。那么小编也在网上收集了一些对于“c语言重载””的相关知识,希望同学们能喜欢,朋友们一起来学习一下吧!12.1 函数重载的条件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
// 函数重载:在C语言中,函数名必须是唯一的,程序中不允许出现同名的函数
// 在C++中是允许出现同名的函数,即在同一作用域内,具有相同函数名,不同参数列表的一组函数,
称为函数重载
// 前提:同名函数、同一作用域下(即在不同作用域下,函数名相同也不是函数重载)
void fun()
{
cout << "fun()被调用了" << endl;
}
class Person
{
public:
void fun() {
cout << "Person 中 fun()被调用了" << endl;
}
};
void test01()
{
fun();
Person p;
p.fun(); // 不是函数重载
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
函数重载的条件:参数列表不同
体现为: 1、参数个数不同 2、参数类型不同 3、参数顺序不同
特别注意: 返回值不同,不能作为函数重载条件
*/
-------------------------------------------------------------------------
void func() // 无参
{
cout << "func()调用" << endl;
}
-------------------------------------------------------------------------
void func(int a) // 有参
{
cout << "func(int a)调用" << endl;
}
-------------------------------------------------------------------------
void func(double a) // a 类型不同
{
cout << "func(double a)调用" << endl;
}
-------------------------------------------------------------------------
void func(int a, double b) // 参数数量不同
{
cout << "func(int a , double b)调用" << endl;
}
void func(double a, int b) // 参数顺序不同
{
cout << "func(double a, int b )调用" << endl;
}
12.2 参数为引用的函数重载
一、 参数为 int &a 和 const int &a, 是否会发生重载 -- 可以!
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
(接收变量优先级高)
void myFunc(int &a) // 不能接收常量, 只能接收变量
{
cout << "myFunc(int &a)调用" << endl;
}
(接收常量优先级高)
void myFunc(const int &a) // 可以接收常量, 可以接收变量
{
cout << "myFunc( const int &a)调用" << endl;
}
// 两个函数可以同时存在,属于函数重载,调用时候不会出现二义性
int main()
{
int a = 10;
myFunc(a); // 结果: myFunc(int &a)调用 // a 是变量
myFunc(10); // 结果: myFunc( const int &a)调用 // 10 是常量,不能 int &a = 10
return 0;
}
因此,形参的引用,加 const 会发生函数重载
****************************************************************************************
二、 参数为 int a 和 const int a, 是否会发生重载 -- 不会!
func(int a) 与 func(const int a) 编译器会认为是同一个主体,类似于“重复定义”,而不是函数重载
const 本质是要求编译提醒我:函数中不要有误修改的操作,因此他们都是一样的
****************************************************************************************
三、 参数为 int a 和 int &a, 是否会发生重载 -- 视传参的不同情况而定!
void myFunc(int a)
{
cout << "myFunc(int a)调用" << endl;
}
void myFunc(int &a) // 本质: void myFunc(int b) int &a = b
{
cout << "myFunc(int &a)调用" << endl;
}
int main()
{
int a = 10;
// myFunc(a); // 会出现二义性 // a 是变量,可以同时被接收
myFunc(10); // 不会出现二义性 // 结果: myFunc(int a)调用
// int &a = 10 这种调用不合法,因此没有二义性
return 0;
}
****************************************************************************************
四、 参数为 int a 和 const int &a, 是否会发生重载 -- 可以同时存在,但调用时候报错!
分析: const int &a( int&a = b) const int b
本质上说: myFunc(int a), myFunc( const int &a) 编译器也认为是同一个东西,可以同时存在,但调用
时候就会报错
12.3“函数重载”碰到“默认参数”应该避免二义性
void MyFunc(string b)
{
cout << "b: " << b << endl;
}
// 函数重载碰上默认参数
void MyFunc(string b, int a = 10)
{
cout << "a: " << a << " b:" << b << endl;
}
int main()
{
MyFunc("hello"); // 这时,两个函数都能匹配调用,产生二义性,应避免
return 0;
}
12.4 函数重载的原理
编译器会用不同的参数类型来修饰相同的函数名
因此,我们看到函数名相同,但在编译器眼里,它们的名字是不同的
比如
void func(){}
void func(int x){}
void func(int x,char y){}
以上三个函数在 linux 下生成的编译之后的函数名为:
_Z4funcv // v 代表 void,无参数
_Z4funci // i 代表参数为 int 类型
_Z4funcic // i 代表第一个参数为 int 类型,第二个参数为 char 类型
标签: #c语言重载