背景:链接属性
1.什么是链接属性
当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序.
标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符作用域与它的链接属性有关,但这两个属性并不相同.
2.链接属性分为三种:
-
external(外部):external链接属性的标识符不管声明几次,存在于多少个源文件,都是属于一个个体.
-
internal(内部):internal链接属性的标识符在同一个源文件内所有声明都是同一个个体,但在其他源文件中多个声明分属不同个体.
-
none(无):没有链接属性的标识符(none)总是当成单独个体,也就是多次声明被当做多个不同的实体.
3.默认链接属性
缺省情况下:
函数和代码块之外的标识符链接属性为external,代码块之内的标识符链接属性为none.
修饰全局变量
对于缺省情况下为external链接属性的声明,在声明前加static,会使这个标识符变成这个源文件私有 internal(内部),这样可以防止它被其他源文件调用.
修饰局部变量
对于缺省情况下为none链接属性的声明,在声明前加static,不会改变这个标识符的链接属性,也不会改变它的作用域,但会改变它的存储类型(生命周期),让它在程序执行的整个过程中一直存在。
int fun()
{
static int k;
}
但是要记得,static修饰局部变量只是修改了生命周期,使k变味了静态变量,使得k在fun函数结束后,没有立即释放,而是等待程序结束后才释放。由于没有修改作用域和链接属性。想要访问这个k,只能再次调用这个fun函数。
修饰函数
同修饰全局变量。
小tips
如何在本文件中使用其他文件中的一个数据,或者函数?
int fun2()
{
extern int k;
}
extern:(1)在声明前加extern,会为这个标识符指定external链接属性.这样就可以在其他源文件声明的外部定义这个实体.比如下面k声明为extern时,函数就可以访问其他源文件声明的外部变量了.
背景:static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化
修饰类成员和修饰类成员函数
class A
{
public:
A() {++_scount;}
A(const A& t) {++_scount;}
static int GetACount() { return _scount;}
private:
static int _scount;
};
int A::_count = 0;
void TestA()
{
cout<<A::GetACount()<<endl;
A a1, a2;
A a3(a1);
cout<<A::GetACount()<<endl;
}
- 静态成员为所有类对象所共享,不属于某个具体的实例
- 静态成员变量必须在类外定义,定义时不添加static关键字
- 类静态成员即可用类名::静态成员或者对象.静态成员来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值
- 当其他类想要访问 A的static成员_count时,只能通过GetAcount来访问。(C++11中可以使用友元与内部类)。