#include <iostream>
using namespace std;
class Box
{
public:
Box(int, int);
int a;
int b;
int show() { return ist; }
static int show2() { return ist; }
// static int show3() { return a; }
//private:
static int ist;
};
Box::Box(int ia, int ib)
{
a = ia;
b = ib;
}
int Box::ist = 1;
int main()
{
Box b(11, 12), c(22, 23);
cout << b.show() << endl;
cout << b.show2() << endl;
cout << b.a << endl;
// cout << Box::ist << endl;
// cout << b.ist << endl;
// cout << c.ist << endl;
return 0;
}
静态数据成员
属于类而非每个类对象,为类对象共享。
定义类而未定义对象时,一般的数据成员不分配空间,只有在定义对象时才分配。
static数据成员在所有对象之外单独分配空间。即使不定义对象,也会分配空间。
在程序编译时被分配空间,到程序结束时才释放空间。
只能在类体外进行初始化。可以这样理解;它为所有类对象共享,因此不能随每个类对象初始化而初始化。
不能使用参数初始化列表对其初始化。
若未赋初值,编译器会自动赋值0。
例外:const static
只要初始化式是一个常量表达式,整型const static 数据成员就可以在类的定义体中进行初始化。在类内部提供初始化式时,成员的定义不必再指定初始值。(C++Primer 第四版中文版第401页)
也就是说当使用const static时,可以在定义体中初始化,但任然需要在定义体之外进行定义
可以通过类来引用,也可通过对象来引用。
如:cout << Box::ist << endl;
cout << b.ist << endl;
静态成员函数
作用是为了处理静态数据成员。
调用一个对象的成员函数(非static)时,系统会把该对象的起始地址赋值给成员函数的this指针。
静态成员函数并不属于某一个对象,没有this指针。
既然他无法指向某一对象,就无法对一个对象中的非static成员进行默认访问(即在引用数据成员时不指定对象名)。
static成员函数无法访问类中非static数据成员。
如果非要引用类的非static数据成员,应该使用对象+成员运算符“."
如;cout << b.a << endl;
以上是面向对象中的static
************************************************************************
以下是面向过程的static
1)static变量
未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。