/*
定义静态成员变量
1、关键字 static 可以用于说明一个类的成员
2、静态成员提供了一个同类对象的共享机制
3、把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,
这些对象共享这个 static 成员
4、静态成员局部于类,它不是对象成员
*/
#if 1
class counter
{
static int num; //声明与定义静态数据成员,默认是private
public:
void setnum(int i)
{
num = i;
}
void shownum()
{
cout << num << '\t';
}
};
//必须在类的外部对静态成员进程初始化
//否则错误 2 error LNK2001
//int counter::num = 0;
void test()
{
counter a, b;
a.shownum();//调用成员函数访问私有静态数据成员
b.shownum();
a.setnum(10);
a.shownum();
b.shownum();
}
#endif
从结果可以看出,访问的是同一个静态数据成员
/*
如果不写静态函数的定义,当不用类定义对象时候,编译不会报错
只有定义类的对象时候,不写的话才会报错
这是c++编译器检查不深!
*/
#if 0
class BB
{
int c0;//默认是private
public:
static int d; //使用公有静态数据成员
void printC()//成员函数访问静态成员变量
{
cout << "c = " << c << endl;
}
void addC()
{
c = c + 1;
}
static void getC()
{
cout << "c = " << c << endl;
}
protected:
private:
int a;
int b;
static int c;//静态成员变量
};
//int BB::c = 10; //屏蔽1
void test()
{
BB b1, b2, b3;
b1.getC();//屏蔽2 屏蔽1 2 竟然编译通过
//打开屏蔽2 则不通过
//错误 5 error LNK2001: 无法解析的外部符号 "private: static int BB::c" (?c@BB@@0HA)
}
#endif
/*
==========static 静态成员函数 和静态成员变量=========
1、静态成员函数数冠以关键字static;
2、静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针;
3、在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用;
4、静态成员函数属于整个类的;
5、static修饰的变量,是属于类,所有的对象都能共享使用;
6、静态函数中 不能使用 普通成员变量 普通成员函数;
*/
#if 1
class BB
{
int c0;//默认是private
public:
static int d; //使用公有静态数据成员
void printC()//成员函数访问静态成员变量
{
cout << "c = " << c << endl;
}
void addC()
{
c = c + 1;
}
//静态成员函数
//c++编译器无法确认是b1.a b2.a b3.a
static void getC()
{
cout << "c = " << c << endl;
//请问在静态函数中,能调用 普通成员属性或者 普通成员函数么?
//cout << "a = " << a << endl;//error C2597: 对非静态成员“BB::a”的非法引用
//普通成员a是属于具体的某个对象的
//因为静态成员变量属于整个类的,分不清楚普通成员变量是哪个具体对象的属性
}
protected:
private:
int a;
int b;
static int c;//静态成员变量
};
/*
如果不写静态函数的定义,当不用类定义对象时候,编译不会报错
只有定义类的对象时候,不写的话才会报错
*/
int BB::c = 10; //必须在类外声明与定义静态数据成员
int BB::d = 11;
//static 修饰的变量,属于类,所有的对象都能共享用
void test()
{
BB b1, b2, b3;
b1.printC(); //10
b2.addC(); //11
b3.printC(); //11 说明静态变量是共用的
b3.getC();
//访问公有静态成员方法1
cout << "BB::d = " << BB::d << endl;
//访问公有静态成员方法2
cout << "b1.d = " << b1.d << endl;
//静态成员函数 调用方法
b3.getC(); //用对象
BB::getC(); //类::
}
#endif