026静态成员变量和静态成员函数

/*
	定义静态成员变量
	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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章