1.C++关键字(C++98)
C++总计63个关键字,C语言32个关键字。
ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再细讲。
2.命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种情况解决这个问题的。
什么意思呢? 举个例子:
在上述代码中编译器报错,大家仔细阅读代码后可以发现,代码中定义了rand这个变量,如果大家以前了解过rand函数的话就知道它其实是库里面的一个函数,可以用来产生随机数。那rand是我们定义的一个全局变量,现在也包含的rand()函数对应的头文件,所以我们打印的时候就在全局范围内找到了两个rand,所以就出错了。
所以这就是C语言的一个缺陷,C语言是不能很好的处理这种情况的,我们只能对我们自己定义的变量重新命名。
也正因如此C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决。
namespace(命名空间)关键字的出现就是针对这种问题的,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
那么什么情况下同一个工程中出现多个同名的变量或函数不会发生命名冲突?
相信大家都能想到,只要它们在不同的域里,它们的作用域互不干扰就行了。
下面我们再举个例子
在上述代码中虽然定义了两个变量a,但是它们两个都是局部变量,它们的作用域都是自己所在的函数,互不干扰,程序也不会发生报错。
但是在上述代码中,如果我们在main函数里打印a程序就会报错。
那么为什么程序会报错呢?
main函数如果要打印a首先会在main函数对应局部域找a,当然它找不到,因为main函数里我们没有定义a,然后就会在全局去找,也找不到,因为我们定义的两个a都是局部的。
如果我们再定义一个全局变量a,程序就不会报错。
在之前的C语言学习中我们知道当全局变量和局部变量名字相同时,局部优先,那现在如果就想在函数f2()打印全局变量a,有没有什么办法呢?
如上图结果我们成功打印出全局变量a,那么为什么在a前面加了这个符号就打印全局变量a了?
:: 叫做作用域限定符。
在a前面加上作用域限定符之后,打印a时就会直接在指定的作用域进行寻找,而::前面啥也不写,就代表限定的作用域是全局。
那么再了解上述内容后,C++中命名空间就是用类似的思想来避免冲突。
2.1命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后**接一对{}**即可,{} 中即为命名空间的成员。
让我们重新看之前举的例子
在之前的解释中我们知道此时发生了命名冲突。
在上述代码中我们通过命名空间和作用域限定符解决了冲突问题。
命名空间不仅可以定义变量还可以定义函数、类型等等。
其次命名空间可以嵌套(多层嵌套)
注意: 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2.2命名空间使用
·加命名空间名称及作用域限定符
·使用using将命名空间中某个成员引入
·使用using namespace 命名空间名称引入
3. C++输入&输出
新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,
那C++是否也应该向这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。
说明:
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
- <<是流插入运算符,>>是流提取运算符。
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。 - 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,
这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有 一个章节更深入的学习IO流用法及原理。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间, 规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因 此推荐使用+std的方式。
std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?
- 在日常练习中,建议直接using namespace std即可,这样就很方便。
- using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。
4.缺省参数
缺省参数其实也是C++补的C语言的一个坑。
4.1缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
下面我们举个例子
我们两次调用Func函数(指定参数a的缺省值为0),第一次调用实参为1,第二次不传参。运行结果如下
4.2缺省参数分类
· 全缺省参数
运行结果如上图所示
· 半缺省参数
注意
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
- C语言不支持(编译器不支持)