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 }
原文地址:https://www.cnblogs.com/qinguoyi/p/10204893.html