最近被各种变量逼疯,感觉学的很不牢靠,重新翻书补一补,归纳一下。
存储类别分类如下:
1. 自动存储持续性
2. 静态存储持续性
3. 线程存储持续性
4. 动态存储持续性
1 自动存储持续性
函数中默认的变量的存储持续性是自动的,作用域为局部,没有链接性。
函数中新代码块中同名变量的定义会隐藏以前的定义,新定义可见,旧定义暂时不可见,程序离开该代码块后,原定义又重新可见了。
存储方式——堆栈。
2 静态持续变量
链接性分为三种:外部链接性,内部链接性,无链接性。
所有的静态变量都是零初始化。
外部链接性
每个使用外部变量的文件,都必须声明这个外部变量。
单定义规则:变量只能有一次定义。
综上所述,变量声明有两种:
- 定义声明:给变量分配存储空间。
- 引用声明:不给变量分配存储空间。
引用声明使用extern关键字,且不进行初始化,否则声明为定义,导致分配存储空间。
//external.cpp
#include<iostream>
using namespace std;
double warming = 0.3;
void update(double dt);
void local();
int main()
{
cout << "Global warming is " << warming << " degrees.\n";
update(0.1);
cout << "Global warming is " << warming << " degrees.\n";
local();
cout << "Global warming is " << warming << " degrees.\n";
return 0;
}
在函数中定义与全局变量同名的局部变量后,该变量被视为自动变量,局部变量将隐藏全局变量。
作用域解析符(::):放在变量名前面时,表示使用变量的全局版本。
注:在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量,使用该变量的其他文件都必须使用关键字extern声明它。
内部链接性
将static限定符用于作用域为整个文件的变量时,该变量的链接性为内部的。
链接性为内部的变量只能在其所属的文件中使用,但常规外部变量都具有外部链接性,即可以在其他文件中使用。
无链接性
将static限定符用于代码块中定义的变量,使用static后,局部变量的存储持续性为静态的,即该变量只在该代码块中可用。
const:const全局变量的链接性是内部的。
可用extern来覆盖const,使其变为外部的,但是使用该变量要用extern声明它。
语言链接性
通过函数原型来指出函数要使用的约定:
举例:
extern "C" void spiff(int);
extern void spoff(int);
extern "C++" void spaff(int);
第一种使用C语言链接性;
第二种、第三种使用C++链接性。
函数的链接性
使用static也可将函数设置为内部的,是指只能在一个文件中使用。ps.必须同时在原型和函数定义中使用该关键字。
可以在函数原型中使用extern关键字来指出函数是在另一个文件中定义的,这要让程序在另一个文件中查找函数,该文件必须作为程序的组成部分被编译,或者是由链接程序搜索的库文件。
3 动态持续变量
new delete
1 使用new运算符初始化
两种初始化方式,用括号初始化,列表初始化。
int *pi=new int(6);
int *pin=new int{6};
2 new失败
P320
3 new:运算符、函数和替换函数
P320
4定位new运算符