首页 » C语言 » C++基础之C与C++的联系和不同(一)

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

原文 http://blog.csdn.net/m0_38001783/article/details/77970121

2017-09-13 22:20:17阅读(199)

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

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

C++<a href=基础之C与C++的联系和不同(一)" src="http://img.blog.csdn.net/20170913203016806?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbTBfMzgwMDE3ODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在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;
}


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

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


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



最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示 »

按 Ctrl+D 键,
把本文加入收藏夹