- 1.命名空间
- 1.1 C++为什么要引入命名空间
- 1.2 命名空间的定义
- 1.3 命名空间的使用
- 1.4 注意事项
- 2.缺省参数
- 2.1 缺省参数的概念
- 2.2 缺省参数的分类
- 2.3 缺省参数的注意事项
- 3.函数重载
- 3.1 C++为什么支持函数重载
- 3.2 什么是函数重载
- 3.3 extern "C"
1.2 命名空间的定义在编程的过程中,变量、函数需要被大量的用到,在C语言中如果不加特定的限制,它们都将存在于全局域中,若以后开发大型项目,每个人都难免会使用相同的名字的变量和函数,C++为了解决这个痛点,引入了命名空间这个概念,可以将我们自己编写的变量和函数统一放到自己的空间中,为后续的移植提供了很大的便利。
1.使用 namespace + 名称 {} 定义最基本的命名空间(既可以定义 变量 也可以定义 函数 )
namespace My_space
{
int _a = 0;
void space()
{
cout << "this is my space" << endl;
}
}
2.命名空间也可以嵌套定义
namespace Your_space
{
int _b = 0;
void your_space()
{
cout << "this is your_space" << endl;
}
namespace Space
{
void space()
{
cout << "this is space" << endl;
}
}
}
1.3 命名空间的使用
命名空间名称加作用域解析符( :: )
int main()
{
My_space::my_space();
return 0;
}
使用using将命名空间中的成员引入
using My_space::my_space;
int main()
{
my_space();
return 0;
}
1.4 注意事项
不建议直接使用 using namespace 名称; 将命名空间全部展开,有可能带来麻烦!
using namespace My_space;
int main()
{
my_space();
return 0;
}
2.缺省参数 2.1 缺省参数的概念
声明或定义函数时为函数的参数指定一个默认值,在调用该函数的时候,如果没有指定实参则采用该默认值,否则使用指定的实参
代码示例:
#include2.2 缺省参数的分类using namespace std; void fun(int a = 10, int b = 20) { int val = a + b; cout << "val = " << val << endl; } int main() { fun(); fun(20, 30); return 0; }
全缺省参数:不需要传任何参数即可调用的函数
#includeusing namespace std; void fun(int a = 10,int b = 20,int c = 30) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; } int main() { fun(); return 0; }
半缺省参数:必须传参数才能调用,且必须是从后向前缺省
#include2.3 缺省参数的注意事项using namespace std; void fun(int a, int b = 20, int c = 30) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; } int main() { fun(90); return 0; }
1.因为实参是从右往左传所以半缺省参数可以省略左边,不能省略右边,不能间隔给
2.缺省参数不能在函数声明和定义中同时出现
3.缺省值必须是常量或者全局变量
4.C语言不支持缺省(编译器不支持)
3.函数重载 3.1 C++为什么支持函数重载
3.2 什么是函数重载1.C语言没法支持重载是因为同名函数没办法区分,C语言在编译后,只对函数名前面加个_,所以没法区分同名函数
2.C++是通过函数修饰规则来区分函数,只要参数不同,修饰出来的名字就不一样,就支持重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据不同的问题
1.函数参数个数不同
2.函数参数类型不同
3.函数参数顺序不同
4.不能依靠返回值不同
#include3.3 extern “C”using namespace std; void fun(int a,int b) { cout << "这是" << a << "和" << b << endl; } void fun(int a, int b,int c) { cout << "这是" << a << "和" << b <<"和"< cout << "这是" << a << "和" << b << endl; } void fun(int a,double b) { cout << "这是" << a << "和" << b << endl; } int main() { fun(3, 8); fun(2, 3, 4); fun(1.3, 9); fun(2, 3.2); return 0; }
在函数前加extern “C”,意思是告诉编译器将该函数按照C语言的规则来编译
#includeusing namespace std; extern "C" void test(int a, double b) { printf("这是%d和%lfn", a, b); } int main() { test(2, 3.2); return 0; }
如下代码会提示错误:
做个小测试来检验一下自己掌握的到底怎么样吧:
下面的代码能构成函数重载吗?
#includeusing namespace std; void TestFunc(int a = 10) { cout << "void TestFunc(int)" << endl; } void TestFunc(int a) { cout << "void TestFunc(int)" << endl; } int main() { TestFunc(30); TestFunc(); return 0; }
如上函数TestFunc(30)在调用的时候给我们的感觉是在调用第二个函数,函数TestFunc()给我们的感觉是在调用第一个函数,,但是,在编译的时候缺省参数并不会影响函数的名字,所以,上面两个函数编译后的函数名是一样的,计算机并不知道调用的是哪个函数,所以上面两个函数不会形成函数重载。
总结:函数重载只和参数的类型,顺序、数量有关系,不能将函数重载和缺省参数混起来,函数重载的原因是符号表中函数的修饰名不同,在最后的链接过程中才可以对号入座。



