命名空间
-
概念:命名空间是新定义的一个作用域,里面可以放函数,变量,定义类,主要作用是防止命名冲突
-
实现:
cppnamespace _name { //成员1 //成员2 //... }
可以嵌套使用
-
成员使用:
cpp//1、使用时带域名 域名::成员名 //2、展开某个成员函数的域 using 域名::成员名 //后续该成员在当前文件可直接使用 //3、展开一整个域 using namespace 域名;
缺省参数
- 概念:是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则采用实参
- 分类:
- 全缺省参数:所有参数都带缺省值
- 半缺省参数:部分参数带有缺省值(缺省值必须从右到左依次给出)
- 注意事项
- 1、半缺省参数只能从右往左依次给出,不能隔着给
- 2、不能再声明和定义时同时给出 原因:两个位置如果给的不统一,编译器就不知道该用哪一个
- 3、缺省参数必须是常用和全局变量,即在编译时要能够明确知道缺省值的内容
- 4、C语言不支持
函数重载
-
概念:相同的作用域,函数名相同,参数列表不同(参数列表不同的具体体现参数类型不同,个数不同,以及类型次序不同,与返回值类型无关)
-
调用原理:函数名相同,编译器如何知道调那个函数?编译期间,编译器通过对实参类型进行推演,根据推演结果找对应的重载函数,如果存在且不会造成二义性则调用否则产出编译错误
- 二义性产生原因:当有多个候选函数能通过不同的转换路径与调用实参匹配,且这些转换的优先级相同,编译器就无法确定哪一个函数是最佳匹配,二义性问题便由此产生
cpp#include <iostream> using namespace std; void func(int x) { cout << "int" << endl; } void func(double x) { cout << "double" << endl; } int main() { short s = 10; // 错误:二义性,short可转换为int或double func(s); // 编译错误:'func': 对重载函数的调用不明确 return 0; }
-
名字修饰规则:即编译器在编译时对函数名字的改写方式
-
C语言:在函数名字前增加下划线
-
C++:编译器将函数参数的类型放置在函数名字中,来保证函数重载时名字在底层的不同
-
-
函数重载的调用是在编译期间 确定的,这一过程被称为静态绑定(或静态多态)。编译器通过以下步骤来确定调用哪个重载函数:
- 候选函数集识别:编译器会先找出所有同名函数,这些函数被称为候选函数
- 可行函数筛选:从候选函数中筛选出参数数量和类型都合适的可行函数
- 最佳匹配选择:依据实参与形参的匹配程度,从可行函数中选出最佳匹配的函数
- 错误检查:如果找不到匹配的函数,或者有多个同等匹配的函数,编译器就会报错