目录
1.声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量。
加上static使得局部变量出了自己的范围后也不会被销毁,延长了生命周期,但其作用域还是局部的不变。
全局变量本身就具有整个程序的生命周期和外部的链接属性,但使用了static修饰后,会使其失去外部链接功能,也就说它只能在本文件中使用(只在该.cpp文件中使用)。
若是static在类中使用呢?
例:
- #include
- using namespace std;
-
- int N = 0; //全局变量
-
- class A {
- public:
- A(int a=10)
- :_a(a)
- {++N;
- }
- A(const A& t)
- { ++N;
- }
- private:
- int _a;
- };
-
- N--;
-
- int main(){
- A a1(10);
- A a2(a1);
- A a3, a4;
- cout <<"N的值:"<< N << endl;
- return 0;
- }
解析:该代码主要是为了统计main函数创建对象时,累计使用了多少次构造函数和拷贝构造的总数。 但全局变量安全性低,任何人都可以改(比如main函数前N被--),使得结果出现了误差,所以尽量不要使用全局变量。

- class A {
- public:
- A(int a = 10)
- :_a(a)
- {
- ++N;
- }
- A(const A& t)
- {
- ++N;
- }
-
- private:
- int _a;
- static int N; //静态成员变量
- };
注意:成员变量一旦加了static关键字后就会处在静态区的,类是处在栈区的,不要因为静态成员变量在类内就以为它和类中其他的成员是在一起的! 所以静态的成员变量只能在类外去定义,类内只能是声明,而且不可赋值!!!
所以静态变量不可于缺省值、初始化列表处赋值。

注:静态成员定义时还得指明是哪个类的成员。生命周期虽然是全局的,但作用域是受类域限制的!
代码如下:
- class A {
- public:
- A(int a = 10)
- :_a(a)
- , N(10) //不可赋值
- {
- ++N;
- }
- A(const A& t)
- {
- ++N;
- }
- private:
- int _a;
- public:
- static int N = 0;
- };
-
- //在类外给值
- int A::N = 0;
- int main() {
- A a1(10);
- A a2(a1);
- A a3, a4;
-
- //静态成员变量的访问方式1:当静态成员变量是public时,
- cout << "静态成员变量N的值:" <
- cout << "静态成员变量N的值:" << A::N << endl;
- A* ptr = &a1;
- cout << "静态成员变量N的值:" << ptr->N << endl;
- return 0;
- }
当静态成员变量是public时,类外函数中有三种访问其变量方式:
1.就是对象.静态成员变量、2.类名+域作用限定符+成员变量、3.指针+箭头访问静态成员变量。

当静态成员变量是private时,类外就无法直接访问了,这时就需要用到静态成员函数了。
静态成员函数:
它与静态成员变量一样,都是前面加static关键字即可,该种函数它只能访问静态的成员变量!!!
- class A {
- public:
- A(int a = 10)
- :_a(a)
- {
- ++N;
- }
-
- A(const A& t)
- {
- ++N;
- }
-
- static int GetN() {
- return N;
- }
- private:
- int _a;
- static int N;
- };
-
- int main(){
-
- A a1(10);
- A a2(a1);
- A a3, a4;
- cout << A::GetN() << endl;
- cout << a1.GetN() << endl;
- }

解析:静态成员函数是公有的,类外可以访问到,而静态成员函数又是类中的,可以随意访问类中的成员,即使N为私有,类外也可以利用公有函数去访问私有成员(这就是封装的特性)。
总结一下static在类中使用的特性:
1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制