1. C++关键字(C++98)
2. 命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用
域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污
染,namespace关键字的出现就是针对这种问题的。
命名空间定义
可以放变量,也可以放函数
此时程序中有三个a
可以通过编译
而我们打印一下,发现a是20
为什么?
因为近
访问全局变量中的a
访问命名空间里的a
命名空间可以嵌套
访问N3里面的变量
如果在一个工程中出现了相同名字的命名空间,那么编译器就把这些名字相同的命名空间合并到一起了
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
~~
命名空间的使用
1,直接在成员面前加N1::
2.using N1::a; 使用这种方法相当于把a作为全局变量
3.using namesapce N1 告诉编译器,把当前N1这个命名空间里的全部内容当作全局变量
3. C++输入&输出
c中printf函数在打印时需要进行格式控制
以前是iostream.h 但为了和c语言区分 所以去掉.h。cout在系统中给定的一个名字叫做std的这个命名空间中
- 使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空
间。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,
后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧
编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。 - 使用C++输入输出更方便,不需增加数据格式控制,比如:整形–%d,字符–%c
4. 缺省参数
C++中函数的参数也可以配备胎
4.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默
认值,否则使用指定的实参。
缺省参数分类
所有参数都带有默认值
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
只有一部分参数带有默认值(从右往左给)
void TestFunc(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
//a.h
void TestFunc(int a = 10);
// a.c
void TestFunc(int a = 20)
{}
// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省
值。
注意:
1 半缺省参数必须从右往左依次来给出,不能间隔着给实参匹配从左往右
2. 缺省参数不能在函数声明和定义中同时出现。(如果值不一样会冲突,一般会在声明中给出,)
3.缺省值必须是常量或者全局变量
4 C语言不支持(编译器不支持)
5. 函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者
是“谁也赢不了!”,后者是“谁也赢不了!”
5.1 函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形
参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
编译期间,编译器会推演实参的类型
参数类型一定只能是其中一个函数的全部类型
同一个作用域,同一个名字,参数列表不能一样,否则不能重载,与返回值类型相同没关系。
参数列表不同:个数,类型,类型的次序。
在c语言中不支持函数重载
为什么c中不支持函数重载?
编译可以通过,这个函数连函数体都没有怎么可能会编译通过?
在编译期间不会找函数具体的问题,因为编译器看到有函数声明,在当前文件没有,但其他文件中可能有
在链接期间。编译器找这个函数地址,找不到报错。
我们可以看到,我们在写函数时用的名字时Add,而编译器在找这个函数时,重新修改了这个名字,把Add修改为_Add。
让我们把文件改回成c++
编译器把名字重新命名为~~?Add@@YAHHH@Z~~
我们再次调用两个Add函数在c++环境下,我们可以看到报错,
(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
编译器重新给了两个函数不同的名字
我们再看一个例子
**(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
(?Add@@YANHN@Z)**我们可以知道在VS编译器中,H代表整形,N代表浮点型。
而在c中编译器只是简单的加了一个前缀_