cpp软件架构狮 2018-07-17 23:29:59
:: 前面不写东西,表示调用全局变量
1)命名空间只能在全局范围内定义
2)命名空间可以嵌套命名空间
3)命名空间是开放的,可以随时向命名空间添加东西(变量,函数,类等)。
4) 声明和实现可分离
5) 匿名命名空间,默认此空间中的函数,变量等只在当前文件中有效,相当于给每个变量、函数前加入static.
namespace TestA
{
int a; //这是在命名空间中未初始化的定义。 当在命名空间进行定义时,而且此命名空间放在头文件,当在其他文件进行调用时,会产生重复定义的问题,编译不过。
int b = 9; //这是在命名空间中初始化的定义
extern int c; //这是命名空间中的声明。
}
#pragma once (第一种)
#ifndef ___ ; #define _____; #endif; ____ 代表一个定义的名字。(第二种)
bool 类型的变量可以把"任何非0值"转换为1.
C语言中,三目运算符返回的是一个变量的值,没有内存空间,不可以修改。
int a = 10;C++语言中,三目运算符返回的是一个变量本身,具有内存空间,可以修改。
int a = 10;如:C语言中,const 修饰的变量是一个只读变量,具有内存。
C++语言中,const 修饰的为常量不具有内存(有额外情况,下面有),它放在符号表中。
1)C++ 中两种情况不一样
const int a = 10; 此时 a 不具有内存,(用一个常量初始化)它放在符号表中。所以不可以对它进行修改。
int b = 9;
const int a = b; 此时a 具有内存(在栈区),因为对它进行赋值的是一个变量b(栈区),可以通过指针间接赋值改变 a 的值。
(上面这种情况为用一个变量初始化 const 变量,所以它可以修改)。
2)在局部变量中。( C语言和 C++ 语言这种情况不一样)
C++语言中:
const int a = 9;
int *p = (int *)&a;
*p = 99;
此时当对 const 常量 a 取地址,编译器会为它分配地址(在栈区);但是 a 常量从符号表中取值,不可被修改。
*p 修改的只是分配的内存空间的值。打印结果: a = 9; *p = 99;
C语言中,变量 a 可以被修改。
3)在全局变量( C语言和 C++ 语言这两种情况一样)
extern const int a = 9;此时对 const 变量 a 取地址或声明 extern 时,编译器会为它分配地址(在只读变量区);这段代码可以编译通过,但是运行阶段会报错,不以被运行。
4)C语言中 const 修饰的变量为外部链接(和普通变量一样)。
C++语言中,const 修饰的变量为内部链接(和普通变量不一样)。
不管是C语言还是C++ 语言,普通变量都是外部链接。
5)const 与 #define 的不同, const 有类型,有作用域,可进行编译器类型安全检查。
#define 无类型,不重视作用域(从定义开始到文件结尾),不可以进行安全检查。
适用范围是不同文件之间变量的调用。(不可以再同一文件不同函数之间使用)
在不同文件之间调用一个外部链接的变量时,只用在调用的文件中写一个 extern 关键字就可以了。
当调用一个内部链接时,需要在被调文件和调用文件中都写 extern 关键字。
不同编译器编译环境效果不同。在vs2013中不可以通过;在QT,linux中可以通过。支持C99的编译器可以通过。
namespace A{ int a = 9; func(){} }
namespace B{int a = 9; func(){} }
using 声明: int main(){using A::a; cout << a < using 编译指令:int main(){using namespace A; cout <
此时打印最近定义的那个。 int main(){ using namespace A; using namespace B; cout << a << endl; } 此时就会报错。编译器不知道选择哪个a 注意:使用using声明或using编译指令会增加命名冲突的可能性。也就是说,如果有名称空间,在代码中 使用作用域解析运算符,则不会出现二义性。12.在 C 语言中,重复定义多个同名的全局变量是合法的(不正规),但在C++ 中是不合法的。
本页共66段,2436个字符,5062 Byte(字节)