一. 函数重载的定义
C++支持在同一作用域中出现同名函数,但是要求同名函数的形参不能一样(个数,类型等)。这样C++函数调用就表现出多态的特点,使用更加灵活。
1.参数列表个数不一样
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void func()
{
cout << "func()" << endl;
}
void func(int a,int b)
{
cout << "func(a, b)" << endl;
}
int main()
{
func();
func( 1 , 2 );
}
当在同一作用域下调用func函数这个先调用哪一个呢?当然是调用第一个因为只有第一个和func传的参数一样。
这里也可以看出当两个同名函数构成函数重载时编译器会选择最适合的函数进行调用
2. 参数的类型不一样
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void func(double a, double b )
{
cout << "func( double a, double b)" << endl;
}
void func(int a,int b)
{
cout << "func(a, b)" << endl;
}
int main()
{
func(1.0, 2.0);
func(1, 2);
}
当调用函数时参数类型不一样也会构成重载。
3.参数顺序不一样
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
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;
}
int main()
{
func(1, 2.0);
func(1.0, 2);
}
当参数顺序也不一样时也构成重载
4.重载和const 形参
当形参被const修饰什么时候构成函数重载呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void func( const int& a )
{
cout << "func( const int& a)" << endl;
}
void func(int& a)
{
cout << "func(int a)" << endl;
}
int main()
{
int i = 10;
func(i);
func(10);
}
当形参被const修饰且const 是修饰对象时 i 无法传给const int &只能传给int& 这样就构成了函数重载 这里 const int& 和int &改成const int*和int* 时候也是一样的构成函数重载,但要是换成 int* const和int *时并不会构成函数重载而是会重复定义
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void func( int* const a )
{
cout << "func( int* const a )" << endl;
}
void func( int* a )
{
cout << "func( int* a )" << endl;
}
int main()
{
int i = 10;
func(&i);
}
5. 函数重载+缺省函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void func( int a= 2 )
{
cout << "func( int a= 2 )" << endl;
}
void func( )
{
cout << "func( )" << endl;
}
int main()
{
func();
}
这里调用func函数的时候编译器不知道应该匹配哪一个会造成歧义。
6. 构成函数重载的条件
第一,函数名要相同,第二,函数参数的个数,类型或者顺序不一样。
但返回值类型不同不可以构成函数重载