- 如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干
- 如想在同类的多个对象之间实现数据共享,可以用静态的数据成员.
1.静态数据成员
静态数据成员是一种特殊的数据成员。它以关键字static开头
class Box
{public:
int volume( );
private:
static int height; //把height定义为静态的数据成员
int width;
int length;
};
- height为静态数据成员,为各对象所共有,而不只属于某个对象
- 静态的数据成员在内存中只占一份空间
- 每个对象都可以引用这个静态数据成员.
- 静态数据成员的值对所有对象都是一样的。如值改变,则各对象中这个数据成员的值都同时改变
说明:
- 静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。
- 静态数据成员是在所有对象之外单独开辟空间。
- 只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。
- 静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放.
- 静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
- 静态数据成员既可以通过对象名引用,也可以通过类名来引用。
静态数据成员只能在类体外进行初始化
int Box∷ height=10;
- 一般形式:数据类型 类名∷ 静态数据成员名=初值;
不能用参数初始化表对静态数据成员初始化
Box(int h,int w,int len):height(h){ } //错误,height是静态数据成员
如果未对静态数据成员赋初值,则编译系统会自动赋予初值0
//引用静态数据成员
#include <iostream>
using namespace std;
class Box
{public:
Box(int,int);
int volume( );
static int height; //把height定义为公用的静态的数据成员
int width;
int length;
};
Box∷ Box(int w,int len) //通过构造函数对width和length赋初值
{width=w;
length=len;
}
int Box∷ volume( )
{return(height*width*length);
}
int Box∷ height=10; //对静态数据成员height初始化华南农业大学电子工程学院
int main( )
{
Box a(15,20),b(20,30);
cout<<a.height<<endl; //通过对象名a引用静态数据成员
cout<<b.height<<endl; //通过对象名b引用静态数据成员
cout<<Box∷ height<<endl; //通过类名引用静态数据成员
cout<<a.volume( )<<endl;
}
在类外可以通过对象名引用公用的静态数据成员,即使没有定义类对象,也可以通过类名引用静态数据成员
如果静态数据成员被定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用
有了静态数据成员,各对象之间的数据有了沟通的渠道,实现数据共享,因此可以不使用全局变量
注意公用静态数据成员与全局变量的不同,静态数据成员的作用域只限于定义该类的作用域内
2.静态成员函数
成员函数也可以定义为静态的
static int volume( );
和静态数据成员一样,静态成员函数是类的一部分,而不
是对象的一部分
- 如果要在类外调用公用的静态成员函数,要用类名和域运
算符“∷ ”
Box∷ volume( );
也允许通过对象名调用静态成员函数
a.volume( );
静态成员函数的作用是为了能处理静态数据成员
- 静态成员函数不属于某一对象,因此静态成员函数没有this指针。既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问(即在引用数据成员时不指定对象名)。
- 静态成员函数与非静态成员函数的根本区别是: 非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。