我们知道c++是在C语言的基础上,容纳进去了面向对象编程思维,并且增加了许多有用的库,c++兼容c并且支持c的所有语法,所以说c++相当于是c的升级版。
单从关键字这方面来讲,c++总计有63个,而C语言32个。
C++关键字:
命名空间:
在c/c++当中要命名大量的变量,函数,以及c++当中的类名,这些变量,函数和类的名称都将存在全局作用域当中,当命名的变量函数太多的时候,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以免命名冲突,或名字污染。
命名空间的定义要用到关键字namespace,后面跟命名空间的名字,然后接一对{ },花括号里面的即为命名空间的成员。
我们这里创建了一个名称为N的命名空间,我们可以看到命名空间当中可以定义变量,函数,结构体。
命名空间可以嵌套,也就是说可以在一个命名空间当中定义另一个命名空间,类似于下面:(我们在命名空间N当中再一次定义了另一个名称为N2的命名空间)
命名空间允许多个名称相同的命名空间存在,编译器到最后会合并成一个。
命名空间的使用
命名空间有三种方法使用:
1,加命名空间名称及作用域限定符
2,使用using将命名空间中某个成员引入
3,使用using namespace命名空间名称引入
C++输入输出
C++也有自己的一套输入输出,
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
3. <>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。
std命名空间的使用惯例: std是C++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对 象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。
函数缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。
函数参数缺省分为 全缺省跟半缺省
f1函数为全缺省,f2为半缺省。
注意:半缺省必须从右往左依次来给出,必须连着,类似下面这种缺省是不对的
C++当中除了函数参数缺省外,还有函数重载的概念。
函数重载:
c++允许在同一作用域当中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或参数类型或参数类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
定义两个名为add的函数参数类型分别是int跟double类型,我们可以看到编译器会根据我们传递的参数的类型调用不同的函数。
函数重载原理:
在这里考虑一个问题c语言并不支持重载但是c++却支持函数重载
函数重载并不是我们表面上看到这么简单,在c/c++程序运行过程中,要经历:
预处理——>编译——>汇编——>链接 四个阶段
在链接过程中链接器在调用函数时会根据函数名来调用相应的函数:
C语言当中对于函数名的修饰函数的参数并未参与其中,也就是说当你在c程序当中定义两个名字一样但是参数类型不同的函数时,编译器并不会认为这是两个不同的函数,会认为这是两个相同的函数,就会报错。
在c++当中就很好的修改了这一点,c++对于函数名的修饰不单单与参数有关,而且还跟参数的数量,参数类型,以及参数类型的顺序相关联,所以说相同名字的函数在调用时会根据参数的不同从而实现函数的调用不同,所以c++允许在同一作用域当中定义参数类型不同名字相同的函数。
引用:
引用不是新定义一个变量,而是给已经存在的变量取了一个别名,并且编译器并不会对这个引用变量开辟内存空间,他和引用对变量共同用着同一块内存空间。
引用类型&引用变量名=引用实体;
在使用引用变量时要注意以下几点:
- 引用变量必须初始化。
- 一个变量可以有多个引用变量。
- 引用一旦引用一个实体,再也不能引用其他实体。
常引用:
当实体变量用const修饰时 引用这个实体的引用类型也必须是const修饰
当变量实体为可读可写时,引用类型的可以是与实体变量权限相同的引用,也可以比实体变量权限更小的引用类型,但是引用类型权限不可以超过实体变量本身。
大家看一下下面这个引用类型:
变量实体b为double类型,当用int类型的引用变量b1来引用b变量时会报错,但是当用const int引用类型b2来引用变量b时却没有报错,这里是什么原因?
当发生类型转化的时候,都会产生一个临时变量(传值返回也是),临时变量具有常性,不能修改,这就导致c2在引用c的时候并不是引用c本身,而是c的临时变量,所以要加上const
指针与引用的区别就在于指针是开辟一块空间来存储变量地址,而引用只是为变量取别名并不会开辟新的内存空间,所以在某些情况下引用的效率要高于指针。
指针与引用的不同点:
- 引用概念上定义一个变量的别名,指针存储一个变量的地址。
- 引用在定义时必须初始化,指针没有要求,但是指针初始化时最好指向null
- 引用在初始化时引用一个实体后,就不再引用其他变量,而指针可以在任何时候指定任何一个同类型的变量。
- 没有nulll引用,但是有null指针。
- 在sizeof中含义不同,引用的结果为“引用类型的大小“,但指针的大小始终是地址空间所占字节的大小。
- 引用的自加即可实现引用实体的增加,指针自加时指针向后偏移一个类型的大小。
- 有多级指针,但是没有多级引用。
- 访问方式不同,指针需要显式引用,引用编译器自己处理。
- 引用比指针使用起来相对安全。由于不存在空引用,并且引用一旦被初始化指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。指针可以指向别的对象,而且可以不被初始化或者初始化为空,因此指针不安全。