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

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。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值