类的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成员是一种 只能在类(及其派生类)作用域内可见的静态变量。