《C++ Primer Plus 第6版》第九章学习笔记
存储持续性
自动存储持续性:函数中声明的变量;
静态存储持续性:函数外定义的变量和用static关键字定义的变量;
线程存储持续性:thread_local声明的变量,其声明周期与所在线程相同;
动态存储持续性:new运算符分配的内存,由delete运算符释放,称为自由存储或者堆(heap)。
作用域和链接性
作用域描述了名称在文件(翻译单元)的多大范围内可见。
链接性描述了名称如何在不同单元间共享。
当函数中有与全局变量相同名称的变量(如var)时,函数中的变量会隐藏全局变量。在函数可以通过作用域解析运算符“::“访问全局变量(如::var)。
//代码片段 int num = 0; void doNum() { int num = 11; cout << "in doNum()" << endl; ::num+=1; //修改全局的num cout << "::num = " << ::num << endl; // 输出全局num cout << "num=" << num << endl; // 输出函数中的num }
静态持续变量
静态持续变量有3种链接性:
-
外部链接性:可在其他文件中访问,定义于代码块之外;
-
内部链接性:只能在当前文件中访问,定义于代码块之外并且使用static限定符;
-
无链接性:只能在当前函数或者代码块中访问,定义于代码块之内并且使用static限定符。
int global_var = 1; // 外部链接性 static int onefile_var = 2; //内部链接性 void foo() { static int nolink_var = 3; //无链接性 }
所有静态持续变量,如果没有被初始化,则其所有位都被设置为0,即零初始化(zero-initialized)。
每个使用外部变量的文件,都必须声明该外部变量:要在多个文件中使用外部变量,只需要定义该变量一次,在其他使用该变量的文件中必须使用extern对其进行声明。
注意:用extern声明外部变量的时候,不要给其赋值,否则声明就成了定义。
下面代码演示两个cpp文件:rgb_color.cpp中定义了外部链接性的静态持续变量,在main.cpp中用extern声明要用到的外部变量。
//rgb_color.cpp int color_r = 0xff0000; int color_g = 0x00ff00; int color_b = 0x0000ff;
//main.cpp #include <iostream> using namespace std; extern int color_r; //声明外部变量 int main() { cout << "Red:" << hex << color_r << endl; return 0; }
在文件中使用static定义内部链接性的静态变量后,在此语句之后的对应变量为该变量,即隐藏了外部同名变量。如果在该语句之前定义了某个函数,且函数中使用extern声明了同名的变量,则在该函数中会使用外部链接性的外部变量。
例如,将上面代码中main.cpp修改如下:
//main.cpp #include <iostream> using namespace std; extern int color_r; int green() { extern int color_g;//使用外部变量,即0x00ff00; return color_g; } // - start here, make a difference ... static int color_g = 32; //定义内部链接性变量; int green2() { extern int color_g; //仍然使用内部链接性,即32 return color_g; } int main() { cout << "green() = " <<hex << green() << endl; // 0x00ff00 cout << "Red:" << hex << color_r << endl;//0x20 cout << "Green:" << color_g << endl; //<< dec cout << "green() = " << green() << endl; // 0x00ff00 cout << "green2() = " << green2() << endl; //0x20 return 0; }
在”static int color_g = 32; //定义内部链接性变量;“这一语句之后,color_g都为32,即0x20,只有green函数中的是外部变量。
const限定符
在C++中,全局变量默认为外部链接性,但const全局变量的链接性为内部的。如果希望某个常量链接性为外部,在定义的时候需要使用extern关键字,在其他使用该常量的文件中要用extern来对其进行声明:
extern const int gloabal_const_data = 100;
函数链接性
默认情况下,函数的链接性为外部,在要使用外部文件定义的函数的文件中,只需声明该函数原型即可,extern关键字为可选。
通过使用static关键字,可以将函数链接性设置为内部,即只能在一个文件中使用。注意,声明和定义中都要用static关键字。
语言链接性
C语言链接:extern "C"
C++语言链接:extern "C++"
以上两者用在函数原型上,指定要使用的约定。