字面上理解,C++可以看成C的++,也就是C+1。那么C++真的就只是C+1这么简单吗?
当然不是。
要讨论C++的出现,我们首先要了解C++的前身:C语言。作为早期计算机发展的产物,C语言的产生无疑是具有标志性和纪念意义的,但同时也是由于产生时间较早,在后续的发展中,C语言的缺点和局限性逐渐有所体现。就像我们现在使用的软件一样,产生BUG,我们就会选择打补丁,C语言也一样。可以说C++的正式出现,就是C语言不断优化扩展的产物。
2、C语言和C++的区别首先从兼容性上来说,因为C++脱胎于C语言,所以C++是可以兼容C语言代码的。其次C语言是一门面向过程的计算机编程语言,而C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
二、简单认识C++先来看一段代码。
这是一段非常经典的“Hello World”代码,那么从这个代码中,我们能看出什么呢?
1、关键字在学习C语言的时候,我们都接触过关键字。C语言中一共有32个关键字,而在C++中,经过程序设计者们的优化和改进,C++的关键字增加到了63个,如下表:
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | FALSE | private | template | void | TRUE |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
以上的关键字中,和C语言重复的32个关键字在使用方法上与C语言保持一致,这样也保证了C++对C语言的兼容性。其他关键字的使用方法我们会慢慢提到。
2、命名空间(namespace)细心的同学在对比上图和C语言的时候应该已经发现了,#include语句下方多了一行没有见过的指令:using namespace std;这就是我们下面要讲的另一个知识点,也是C++对于C语言的改进之一:命名空间(namespace)。
什么是命名空间举个例子,你有两个都叫做张三的朋友,分别来自不同的地方。有一天你收到一封信,信上只写了张三,却没写地址,你是不是就蒙了,到底是哪一个张三给你写信,你又应该回信给哪一个张三?这时候,如果信上写明了来自杭州或者上海,那你就明白了,原来是这个张三给我写信。这个“杭州”或者“上海”就可以理解为命名空间了。
命名空间的作用对应到C++中,假如我有两个同名对象都叫 F,但两者定定义不同,我们在学习过C语言后就会知道,在C语言中是不可以出现同名对象的,因为会有重定义的问题,编译器在执行编译时。会因为无法确定对象的类型而编译失败,如下图:
如上图所示,假设我们需要定义一个变量来存储随机数,那我们首先想到的就是将这个变量命名为rand,但实际上rand是一个库函数,如果我们再使用rand去命名对象,就会出现上面显示的重定义,就产生了命名冲突。对于原有的rand函数我们是不会去动他了,那对于自定义变量rand,如果我们想要使用它,我们就需要对rand进行一个修饰,或者叫限制,这时候命名空间就可以发挥他的作用了。如下图:
根据上图我们可以看到,我们通过namespace命令设置了一个空间T,将变量rand放在了空间T中。在调用变量rand时,我们使用作用域限定符 :: 将rand的定义范围限定在空间T中,可以理解为T中的rand,就像上文举的例子中的来自杭州的张三。此时,虽然变量的名称还是rand,但由于两者来自不同的作用域,所以就不会有重定义的问题。对于库函数rand,我们打印的是rand函数的地址,所以就有了上面显示的结果。
命名空间的结构命名空间由四部分组成:关键字namespace、空间名、{}以及{}中的空间内容。
空间名可以由用户自行定义,假如你在设置空间名的时候发生了重复,在编译的时候,编译器会自动将这两个空间进行合并。需要注意的是,如果这两个同名空间中存在同名不同定义的变量名,还是会发生重定义的问题,如下图:
空间内容的输入规则和我们平时在main函数里写代码的规则相同,可以定义变量,可以定义函数。namespace同样也可以用在空间内容里,也就是说命名空间是可以嵌套的,如下图:
需要注意的是,命名空间定义的空间是作为一个域独立存在的,虽然我们可以通过空间名去访问空间内的成员,但空间内的成员不会影响外部环境。
命名空间的使用在使用命名空间之前,我们需要先对空间内容进行构建,此时你可以添加到空间里的对象包括变量、函数、新的命名空间等等,如下图:
这里需要注意,虽然空间已经构建好了,我们在主程序还是不能直接对空间内的对象进行调用,而是需要通过其他方式。在这里我们一共有三种方法进行调用。
第一种:通过作用域限定符::和空间名称直接调用(空间名称::对象名称)
第二种:使用using将命名空间内的成员直接导入(using 空间名称::对象名称)
第三种:使用using namespace命名空间直接引入(using namespace 空间名称)
以上三种方式都可以访问到空间T内的成员,但需要注意的是,如果通过第二、第三种方法引入空间,假设外部空间存在同名成员,还是会出现重定义,因为通过第二、第三种方式引入,相当于直接将空间T内的成员释放到外部空间,是可以被直接访问的,相当于直接定义在外部环境的对象。所以,即使使用命名空间有助于防止重定义的发生,我们还是要注意,在命名对象时,尽量使用不同的名字。
3、输入输出由于C++兼容C语言,所以在输入输出时,我们依旧可以使用scanf和printf函数,但是C++给我们提供了一种新的输入输出方式:cout标准输出(控制台)和cin标准输入(键盘)。
cout和cin都包含在iostream头文件里的std(标准命名空间)中,所以在使用时,我们需要输入包含iostream头文件并引入std空间。而且相比较于scanf和printf函数,cout和cin在数据做了处理,使得我们在输入输出时不需要再特意去指定数据类型进行格式控制,如图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)