类的static成员总结

类中添加static成员的目的:为了解决数据共享问题。

当然全局对象也可以实现数据共享,但相比,static有以下两个优点
(1)封装性:static成员可以是私有成员,而全局对象是全局的,一般用户代码就可以修改这个值。
(2)避免命名冲突:static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。

1. static关键字只能用于类定义体内部声明中,定义不能标示为static。

2. static成员函数可以直接访问类的static成员,但不能直接访问非static成员;
类成员函数可以直接访问类的static成员。
3. static成员必须在类定义体外定义且只能定义一次。
   static成员不能通过构造函数,而是在定义时初始化。
   static关键字只能用于类定义体内部声明中,定义不能标示为static。
4. static成员不是雷对象的组成部分,故static成员可以使该成员所属类型。

   非static成员被限定声明为自身的指针或引用。

class Bar{
public:
	//...	
private:
	static Bar	mem1;	//ok
	Bar			*mem2;	//ok
	Bar			mem2;	//error
}

5. static 成员不是类的一部分,但是在类的作用域内是可见的。

全局变量不是类的一部分,但是对类来说,是可见的

类似地,static成员也不是类的一部分,但是对类来说,static成员在其作用域内是可见的。

#include <iostream>
#include<string>
using namespace std;

class Base{
public:

   static int a;
   static void Fun(string str){
       cout<<str<<endl;
   }

   int B_int;

};
int Base::a=10;//static关键字只能用于类定义体内部声明中,定义不能标示为static。

class Derived:public Base{
public:
	void fun(string str){
		Fun(str);
	}
	int D_int ;
};

int main(void){

	Derived d;

	cout<<"派生类和基类的大小中没有计算static成员,static成员不是类的一部分!"<<endl;
	cout<<sizeof Base<<endl;
	cout<<sizeof Derived<<endl;
	

	string str;
	str="这是基类的静态成员函数";
	Base::Fun(str);

	str="基类静态成员函数对派生类作用域是可见的";
	Derived::Fun( str );

	str="派生类的成员函数可以直接调用基类的静态成员函数";
	d.fun(str);

	return 0;

}
因此,类的static成员是一种 只能在类(及其派生类)作用域内可见的静态变量。


posted @ 2014-07-18 10:14  StevenSuo  阅读(636)  评论(0编辑  收藏  举报