Hello,小伙伴们大家好,前面我们基本介绍完了C语言的有关知识,那么接下来我们就要开始学习比C语言更难的C++了。废话不多说,我们直接开始。
一、C++介绍
在学习之前我们先来简单了解一下C++的起源。
我们知道C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
到目前,C++还在不断的向后发展。
以上就是C++语言的起源,对C++发展史感兴趣的小伙伴可以上网了解一下,这里不再赘述。下面我们就正式进入C++的学习。
二、C++关键字
我们知道C语言的关键字有32个,但是C++的关键字有63个,当然里面也包含了C语言中的关键字。大家也不用刻意的去背诵,后面通过不断地学习会一一的介绍使用习惯了就记住了。
C++关键字:先了解一下
三、命名空间
我们在用C语言进行编程的时候可能会遇到命名冲突的问题,即:
1.程序员和库之间的命名冲突;
2.程序员和程序员之间的命名冲突。
如:
我们自己在平时写代码时可能不会命名冲突,但以后我们在工作时往往需要多个人完成一个项目,这就可能导致我们与别人的命名相同而起冲突。C++就解决了这个问题——命名空间。
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1.命名空间定义
命名空间的定义很简单,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可。如:
命名空间的定义通常有以下几种情况:
(1)命名空间中可以定义变量、函数和自定义类型等。如:
(2)命名空间可以嵌套。
当我们的命名空间的名字也冲突了该怎么办呢?这个时候我们可以再套一层命名空间。如:
虽然命名空间可以嵌套,但通常情况下,我们最多也只会嵌套2到3层。
(3)同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。也就是说不同的文件中可以定义相同的命名空间,程序在编译时相同的命名空间会合并。如:
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,但是生命周期不会局限于该命名空间中。
2.命名空间使用
上面说了命名空间的定义,那么该怎么使用呢?
我们知道编译器在查找变量或者函数时会先在当前局部域中查找,没有找到再在全局域中查找,但是不会去命名空间查找。所以上面的代码中报错显示未定义add。
下面就来介绍命名空间的使用方法:
(1)加命名空间名称及作用域限定符
域限定符就是两个冒号: : ,在前面加上命名空间名称就可使用命名空间中变量、函数等。如:
注意:结构体在使用时命名空间的使用要放在中间。
当嵌套了多层时重复一下就行了。如:
(2)使用using namespace展开命名空间
命名空间虽好但是每次使用都要在前面加符号,如果时平时写一点代码还不要紧,但是以后做项目就会很麻烦,所以为了解决这个问题我们可以使用using namespace展开命名空间,那么命名空间里的变量、函数等就可以直接使用了。如:
展开命名空间很爽,但是也有缺点,上面我们提到局部域和全局域,命名空间其实也是一个域,即:命名空间域,当我们展开命名空间也就意味着我们允许编译器到命名空间域中去找,这就可能导致出现一下几种情况(都是在命名空间展开的情况下):
1.如果多个命名空间里面有相同名字的变量会冲突。也就是说编译器不知道用哪一个。如:
2.如果命名空间中有和库中函数等的名字相同会冲突。如:
3.命名空间中的变量名字会和全局域中的变量名字起冲突,但不会于局部域中变量名字的起冲突。如:
这是因为编译器会优先在局部域中查找,没找到才会在全局域和命名空间域中查找。而命名空间展开实际上是被展开到了全局域中,所以会与全局域中的名字冲突。命名空间的展开是为了在全局范围内使用其成员,但它不等同于全局域。
所以:命名空间的展开并不适用所有程序,还要看具体场景。
当然展开命名空间也有许多比较智能的地方,下面就来举个例子来解释:
我们可以看到这里用两个命名空间分装了两个栈(简写一下),其中一个命名空间展开了,另个没有,下面在使用时定义了两个不同的栈,我们发现调用初始化函数时并没有加命名空间使用符号,但是两个栈却自己找到了自己所在命名空间的初始化函数进行调用。按照前面我们所说这里的第二次调用的Init()函数也应该是Xing命名空间里的,因为Xing命名空间展开了,命名空间stack没有。这就是它智能的一点,当我们定义的栈已经有归属时编译器会自动识别调用那个命名空间中的函数。
上面只是举了栈的例子,相似的应用场景有很多。
(3)使用using将命名空间中某个成员展开
上面我们提到有些场景不适合将命名空间展开,但是又遇到那些经常要使用的变量或函数等,那该怎么办呢?将命名空间中的某个成员展开即可。如:
这个时候这个成员被展开可以不加使用符号,但是其他的成员依旧要加。
四、C++输入和输出
在学习C++输入和输出前我们先来了解另一个知识,我们之前在编写C语言程序的时候,开头总要包含<stdio.h>头文件里面有一些我们必须要用的库函数,C++也是一样,在C++中我们通常在开头包含<iostream>头文件,如:
C++为了安全起见将库中的函数和变量等都封装在了命名空间中,所以我们在使用时库函数时要加上命名空间使用符或者展开命名空间,而std就是<iostream>的命名空间名。
注意:我们平时在写一些自己程序时为了方便起见可以直接展开命名空间,但是在工作做项目时最好不要展开。
C++的输入和输出很简单,使用时我们只要注意以下几点即可:
注意哦:
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在<iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
下面我们来看例子:
相较于C语言中的输入输出,C++的就方便的多。
但是关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等。因为C++兼容C语言的用法,这些又用得不是很多,这里就不展开介绍了。感兴趣的下伙伴可以去网站中查。
好了,以上就是本期的全部内容了,后面将继续讲解C++的入门,感谢大家的观阅!创作不易,三连支持一下呗!