静态数据成员
静态数据成员特点:在每个类中只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。 静态数据成员的定义格式:
static 类型标识符 静态数据成员名;
静态数据成员的初始化:
类型标识符 类名::静态数据成员名 = 初始值;
说明:
- 静态数据成员属于类所有对象共有,占一份内存空间;
- 静态数据成员在程序开始编译时就分配空间,而不是某个对象创建时分配的。也不随对象的撤销而释放,而是程序结束才释放空间;
- 初始化在类体外进行,且前面不加static,以免与一般静态变量想混淆;
- 初始化时不加该成员的访问权限修饰符private、public等。
- 初始化时使用作用域运算符来表明他所属类,因此,静态数据成员是类的成员,而不是对象的成员。
静态数据成员不属于任何一个对象,可以通过类名直接对他进行访问,一般用法:
类名::静态数据成员
例1:
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
private:
double length;
double breadth;
double height;
};
int Box::objectCount = 0;
int main(void)
{
Box Box1(3.3, 1.2, 1.5);
Box Box2(8.5, 6.0, 2.0);
cout << "Total objects: " << Box::objectCount << endl;
return 0;
}
结果:
Constructor called.
Constructor called.
Total objects: 2
静态成员函数
static 函数类型 静态成员函数名(参数表);
类名::静态成员函数名(参数表);
-
静态成员函数特点:
- 共有静态成员,可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。静态成员函数可以由类名通过”::“直接调用;
- 静态成员函数可以直接访问该类的静态数据成员和静态成员函数,不能直接访问非静态数据成员和成员函数。
-
静态成员函数与普通成员函数的区别:
- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。
例2:
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
static int getCount()
{
return objectCount;
}
private:
double length;
double breadth;
double height;
};
int Box::objectCount = 0;
int main(void)
{
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1(3.3, 1.2, 1.5);
Box Box2(8.5, 6.0, 2.0);
cout << "Final Stage Count: " << Box::getCount() << endl;
return 0;
}
结果:
Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2
|