作用域:描述了名称在文件的多大范围内可见;
链接性:描述了名称如何在不同单元间共享;
外部链接性:可在其他文件中访问;
内部链接性:只能在当前文件中访问;
无链接性:只能在当前函数或代码块中访问。
自动存储持续性
在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动的,作用域为局部,没有链接性;
如果在代码块中定义了变量,则改变量的存在时间和作用域将被限制的该代码块内;
int main()
{
int a = 0;
for(int i = 0; i < 2; i++)
{
int a = 1;
}
}
如果出现上述情况,则在执行内部代码块的时候会自动隐藏外部代码块中的同名变量a,当内部代码块执行完毕之后,外部代码块中的a又变为可见的。
静态持续变量
静态持续变量有三种链接特性:外部链接性、内部链接性、无链接性
外部链接性的静态变量
想要创建这种变量,必须在代码块的外面声明它。
在其他文件中访问需要添加extern说明符(引用声明)。
//源.cpp
#include"fun.h"
#include<iostream>
using namespace std;
int money = 0;
int main()
{
add_money();
cout << money; //输出1
return 0;
}
//fun.h
void add_money();
//fun.cpp
#include"fun.h"
void add_money()
{
extern int money; //extern表示引用声明,告诉编译器money的定义去其他文件找
money++;
}
内部链接性的静态变量
要想创建这种变量,必须在代码块的外面声明它,并使用static限定符;
注:在代码块的外面使用const加以限定,那么在其他文件也不能访问。
//源.cpp
#include"fun.h"
#include<iostream>
using namespace std;
static int person = 0;
const int money = 0;
int main()
{
fun();
cout << person << money;
return 0;
}
//fun.h
void fun();
//fun.cpp
#include"fun.h"
void fun()
{
const int money;//错误,无法访问外部符号
extern int person;//错误,无法访问外部符号
}
无链接性的静态变量
要想创建这种变量,必须在代码块的里面声明它,并且使用static限定符。
#include<iostream>
using namespace std;
class Person
{
public:
static int money; //要记得初始化
};
int Person::money = 0;//类的静态数据成员须在类外初始化,常静态数据成员可以在类内初始化
int main ()
{
money++;//错误,money的作用域在Person类中
return 0;
}
限定符和说明符
cv-限定符
cv表示const和volatile
const表明内存被初始化之后,程序员不能再对其进行修改。
volatile表明即使程序代码没有对内存单元进行修改,其值也可能发生改变。该关键字的作用是为了改善编译器的优化能力。这里笔者不是很懂,就不写那么多了。
mutable
mutable表明即使类和结构体对象为const,其某个成员也可以修改。
#include<iostream>
using namespace std;
class Person
{
public:
mutable int money;
int age;
};
int main()
{
const Person p1;//创建常对像p1
p1.money = 1;//正确money被volatile限定
p1.age = 18;//错误,常对象不能修改其内部成员
return 0;
}
函数的链接性
首先C++不允许在一个函数中定义另一个函数,因此所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一直存在。
其次,在默认情况下,函数的链接性为外部的,即可以在文件间共享。实际上可以在函数原型中使用关键字extern来指出函数是在另一个文件中定义的,不过这是可选的(要让程序在另一个文件中查找函数,该文件必须作为程序的组成部分被编译,或者是由链接程序搜索的库文件)。
最后,还可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中使用,但必须同时在函数原型和函数定义中使用。**