《C++》2.缺省参数,函数重载

1.缺省参数

// 缺省参数

void Func(int a = 0)
{
	cout << a << endl;
}

int main()
{
	Func(1);
	Func();
	return 0;
}
//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}

int main()
{
	Func();
	Func(1);
	Func(1,2);
	Func(1, 2, 3);
	return 0;
}
//半缺省    部分缺省参数
void Func(int a, int b = 20, int c = 30)   //可以任意个缺省参数,但必须从右往左连续缺省
{
		cout << "a = " << a << endl;
	    cout << "b = " << b << endl;
      	cout << "c = " << c << endl << endl;
}

int main()
{
	Func(1);
	Func(1,2);
	Func(1, 2,3);  //未缺省参数必须赋值
	return 0;
}
//若函数定义和声明不在一个文件,则缺省参数不能在声明和定义中同时出现,推荐在头文件中使用缺省参数(如下)
void Func(int a = 1);

void Func(int a)
{
	cout << a << endl;
}

2.函数重载:C++允许在同一作用域中声明几个同名函数,这些函数的形参列表不同(形参个数,类型,顺序),常用来处理功能类似数据类型不同的问题

1. 形参个数不同
void Func()
{
	cout << "void Func()" << endl;
}
void Func(int a)
{
	cout << "void Func(int a)" << endl << endl;
}

 2.形参类型不同
void Func(int a, int b)
{
	cout << "void Func(int a, int b)" << endl;
}
void Func(double a, double b)
{
	cout << "void Func(double a, double b)" << endl << endl;
}

3.形参顺序不同 (存在相同位置形参类型不同)
void Func(int a, char b)
{
	cout << "void Func(int a, char b)" << endl;
}
void Func(char a, int b)
{
	cout << "void Func(char a, int b)" << endl << endl;
}

int main()
{
	Func();
	Func(1);
	Func(1, 2);
	Func(1.1, 2.2);
	Func(1, 'a');
	Func('a', 1);
	return 0;
}
1.缺省值不同,不构成重载
void f(int a)
{
	cout << "void f(int a)" << endl;
}
void f(int a = 1)
{
	cout << "void f(int a = 1)" << endl;
}
int main()
{
	//ERROR!!!
	f(1);
	f();
	return 0;
}


2.一个无参数,另一个有一个缺省参数,两函数构成重载,但调用会存在二义性
void f()
{
	cout << "void f()" << endl;
}
void f(int a = 0)
{
	cout << "void f(int a=0)" << endl;
}
int main()
{
	f(1);
	f();  ERROR!!!
	return 0;
}

 函数重载原理

以Linux环境下函数名修饰为例,g++的函数修饰后变成【_Z+函数长度+函数名+类 型首字母】

如函数 void f(int a,int b)  经过函数修饰后变成 _Z1fii

            void func(int a,double b,char*c)经过修饰后变成 _Z4funcidPi

而gcc的函数修饰后名字不变,故这也是C语言不支持函数重载的原因

实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有 Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。

你可能感兴趣的:(C++,c++)