C++基础之C与C++的联系和不同(一)

来源:互联网 发布:淘宝数据包里面是什么 编辑:程序博客网 时间:2024/06/12 10:51

C语言是一门非常优秀的面向过程的编程语言,但它也有很多缺点,总的来说就是不太适合现代的软件开发,例如不容易维护、不容易扩展等等,具体缺点我就不描述了,所以C++语言被发明出来。C++完全兼容C语言,也增加了一些自己的特性与精华。

由于C++完全兼容C语言,所以C语言使用的头文件在C++中都可以用,例如stdio.h、string.h等等,甚至C++文件也可以用C语言写。但C++也增加了一些自己的头文件,早期C++头文件都是和C语言头文件类似,如iostream.h,后来变成了iostream,如果包含头文件时使用iostream.h,会因为找不到,出现这样的错误:


在C语言中,全局变量可以被重定义,这导致在多人合作开发大型项目时,会发生错误,因为重定义的变量使用的是同一块地址空间,而C语言不会检测出来。在C++中,针对这个情况,增加了命名空间的概念,可以理解为给一块指定的全局作用域取一个名字,不同的命名空间中如果有相同名字的变量,不会发生重定义的情况,因为它们使用的是不同的地址空间,值得注意的是,命名空间名字相同也会发生重定义,但这是一个错误,会被检测出来。命名空间使用关键字namespace 来定义。例如:

namespace nameA{int a;void swap(int *a,int *b){int temp = *a;*a = *b;*b = temp;}}

而关于命名空间的使用也有一些注意点,最直接的使用办法是使用“::”这个域解析符,例如nameA::a,也可以使用关键字using,这样不用加域解析符,使用方法如下:

namespace nameB{int a = 14;}int main(){using namespace nameA;a = 23;int b = 8;swap(&a,&b);printf("a = %d,b = %d,   a = %d\n",a,b,nameB::a);return 0;}

在using声明之后(如果此声明在一个函数之内,函数外不受影响,类似于局部变量的作用域)使用的变量或者函数等,只要没指明具体的命名空间,都将使用using声明的命名空间中的内容。这样就带来一个问题,即和全局变量产生冲突,也就是二义性。解决这个问题的办法是使用域解析符。全局作用域为默认的命名空间,没有名字,一般情况下不用特别标示,在这种冲突的情况下,域解析符前不加命名空间名来表示全局作用域的变量(全局变量)。例如

int a;int main(){using namespace nameA;nameA::a = 23;::a = 14;swap(&::a,&nameA::a);printf("a = %d,b = %d,   a = %d\n",nameA::a,::a);return 0;}



还有一种匿名空间,即定义时不取名字,经过编译器转换后为一个唯一的名字。使用时,如果不与全局变量产生二义性,使用方法和全局变量类似,如果产生冲突,域解析符前不加命名空间名表示的是全局作用域的变量(全局变量)。匿名空间可以用来使全局变量只能在一个编译单位内使用,不会影响到其他文件。


using也可以指定命名空间中的一个元素开放,仅仅这一个元素可以不使用域解析符。如using nameA::a。