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