龙空技术网

C++知识点 12:函数重载

Tina是个小妹妹 152

前言:

当前小伙伴们对“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语言重载