c++的static
static对于C++的数据共享有着非常重要的作用。
在类中申明的static数据是从属于类而不是对象,也就是说所有的对象都拥有共同该数据信息:
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx = 0, int yy = 0) { X = xx; Y = yy; countP ++; }
Point(Point &p);
~Point() { countP --; }
int GetX() { return X; }
int GetY() { return Y; }
void GetC() { cout << "Object id = " << countP << endl; } //输出静态数据成员
private:
int X, Y;
static int countP; //静态数据成员声明,用于记录点的个数
};
Point :: Point(Point &p)
{
X = p.X;
Y = p.Y;
countP ++; //在构造函数中对countP累加,所有对象共同维护同一个countP
}
int Point :: countP = 0; //静态数据成员定义和初始化,使用类名限定
int main()
{
Point A(4, 5); // 定义对象A,其构造函数会使countP增1
A.GetC(); //输出对象个数
Point B(A); //定义对象B,其构造函数会使countP增1
B.GetC();
return 0;
}

总结:
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,
注意:静态成员的初始化在类的外面,因为这个静态成员不是属于对象,在对象没有实例化之前是不能通过对象去访问的,但是在外面可以直接通过类名就访问到
因为静态成员不需要类实例化就已经被分配了内存空间。
静态成员函数:
被static修饰过的静态成员函数与静态数据相似,不属于对象,而是属于类,要注意得是静态成员函数只能访问静态变量,非静态的访问不到。一般静态函数用来给静态变量初始化。
class A{
public:
static void fun(A a);
private:
int x;
};
void A :: fun( A a){
cout << x; //对x的引用是错误的
cout << a.x; //正确
}
这里已经可以很清晰的了解静态作用域的问题。
总结:
1.出现在类体外的函数定义不能指定关键字static;
2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
3.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
4.静态成员函数不能访问非静态成员函数和非静态数据成员;