C++对C的扩展与增强

C++对C的扩展

1. 双冒号::作用域运算符

代码中对同一个变量多次声明,在代码块中使用时,局部变量会将全局变量隐藏。若在代码块使用变量前添加::,表示为全局变量。

::表示作用域运算符,如常见的std::cout,std::endl;等,表示cout和endl是std作用域下的标识符。

2. 命名空间namespace

主要用来解决命名冲突的问题,如多个人开发的不同模块中使用了相同的变量名和函数名,fatal error LNK1169:找到一个或多个重定义的符号,这时可以使用命名空间,将不同的模块分隔开。

1 namespace QGY{
2     int a;
3     void test();
4     struct QGYTEST{
5         int b;
6     };
7     class QGYNUM{};
8 }

使用命名空间的注意事项:(1)必须在全局作用域下声明;(2)命名空间下可以放函数,变量、结构体和类;(3)命名空间可以嵌套命名空间;(4)命名空间是开放的,可以随时加入新成员(添加时只需要再次声明namespace,然后添加新成员即可,示例如下);(5)无名或匿名命名空间,相当于static变量;(6)可以对命名空间起别名(一般不用)

namespace QGY{
	int m ;
}

3. using声明和using编译指令

using QGY::a; //声明
using namespace QGY; //编译指令

对于声明来说,如果局部范围内还有a,会出现二义性,程序不知道使用哪一个,因此应避免这种情况.

1 void test01(){
2     int a = 10;
3     using QGY::a; //这里在声明的时候不能进行赋值,可以在下一行,a = 20;
4     std::cout << a << std::endl;
5 }

这里程序会出现错误, error C2874: using 声明导致“QGY::a”的多次声明。

对于编译指令,如果局部范围还有a,会使用局部变量。如果还有另外的命名空间也声明了a,且同时打开了其他空间,则也会出现二义性。

1 void test02(){
2     int a = 10;
3     using namespace QGY; //这里只是打开空间,并没有指定使用
4     std::cout << a << std::endl;
5 }
1 void test03(){
2     using namespace QGY; //只是打开房间就可以访问到a,打开多个房间就会产生二义性
3     std::cout << a << std::endl;
4 }

C++对C的增强

 1.全局变量检测

C语言会忽略对全局变量重定义的检测,但不会忽略对局部变量的检测,C++中都会报错:error C2086: “int a”: 重定义

//全局变量不会报错
int a;
int a = 10;

//局部变量会报错
void test(){
	int a;
	int a = 10;
}

2.函数检测增强:包括函数形参类型检测,形参数目检测,函数返回值检测,C都会忽略,C++不会

1 //C中函数形参没有参数类型,没有返回值,调用参数过多都会忽略
2 int test(m, n){
3 
4 }
5 
6 void test01(){
7     test(1,2,3);
8 }

猜你喜欢

转载自www.cnblogs.com/qinguoyi/p/10204893.html