作用 | 参考代码 | 备注 | |
面向对象中的static | 静态全局变量 | | (1)该变量在全局数据区分配内存;具有全局寿命; (2)未经过初始化的静态全局变量,默认初始化为0; (3)a为静态变量,并且是全局的,只能在定义a的文件中使用a,在其他的文件中不可见 |
静态局部变量 | void fun() { int a = 1; static int b = 2; } void main() { static int b = 3; } | (1)静态局部变量在全局数据区分配内存,具有全局寿命; (2)静态局部变量在对象被第一次声明时初始化,以后的调用都不用再初始化。 (3)未被初始化的静态局部变量,默认初始化为0; | |
静态函数 | static void fun () { //code } | 只能在定义它的文件中使用,在其他文件不可见。 | |
面向过程中的static (在类中使用) | 静态数据成员 | 程序见下面pro1 | (1)非静态数据成员,每个类对象都有自己的拷贝。然而静态数据成员,不管这个类被对象被定义了多少次,都只有一个拷贝,所有对象共享这一个拷贝,所有对象共用,它的值可以更新。 (2)静态数据成员存储在全局数据区,不能再类的声明中定义。语句int Point::countP = 0;是定义静态数据成员。 (3)由于静态数据成员在全局数据区分配内存,所以它不属于特定对象,在没有类的实例情况下就可以操作它。 (4)静态数据成员初始化格式: <数据类型><类名>::<静态数据成员名>=<值> 注意只能在全局区初始化,不可以在类内部初始化。 访问形式: <类对象名>.<静态数据成员名> <类对象指针> -> <静态数据成员名> <类名>::<静态数据成员名> (5)静态数据成员同样遵循public、protected、private访问规则。 |
静态成员函数 | 与静态数据成员规则一样。 访问形式: <类名称>::<静态成员函数名>(参数列表); 类对象操作符. 和该对象指针 -> | ||
参考:https://blog.csdn.net/mary19920410/article/details/69053361 |
pro1:
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx = 0, int yy = 0)
{
this->X = xx;
this->Y = yy;
countP ++;
}
Point(Point &p);
~Point() { countP --; }
int GetX() const{ return this->X; }
int GetY() const{ return this->Y; }
void GetC() const{ cout << "Object id = " << countP << endl; } //输出静态数据成员
private:
int X, Y;
static int countP; //静态数据成员声明,用于记录点的个数
};
Point :: Point(Point &p)
{
this->X = p.X;
this->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;
}