静态成员分为:
1.静态数据成员
2.静态成员函数
静态成员的特点:
1.不管创建了多少个对象,它都只有一个副本,这个副本由所有属于这个类的对象共享。
2.静态成员解决了不同对象间的数据和函数共享问题,不属于任何一个对象,它的作用域是类范围。
3.静态成员在每个类对象中并不占存储空间,只是在类中分配存储空间,供所有对象使用。每个对象都可以对该类的静态数据成员的值进行更新。
4.静态数据成员具有静态生存期,必须对它进行初始化。在vs2012环境下,发现这点有问题,在类外定义但不初始化可以通过编译。
5.公有的静态数据成员可以直接访问,但私有(private)、保护(protected)的必须通过公有接口进行访问。
静态数据成员初始化的注意事项:
1.类中的声明只是静态数据成员的引用性声明,应在类体外定义并初始化,静态成员初始化与它的控制权限无关。
2.初始化时不加static,避免和一般静态变量或对象混淆。
3.由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的类。
4.公有的静态数据成员可以直接访问,但私有的或保护的静态数据成员要通过公有的接口进行访问,一般将这个公有的接口定义为静态成员函数。
所有的变量其实在使用前都要定义,当然,静态成员变量在其中。
静态成员函数
静态成员函数属于整个类,不属于类中的任意一个对象。
静态成员函数既可以在类体内声明,也可以在类体外声明,在类体外声明时不需要加static前缀。静态成员函数在类中只有一个副本,它可以直接访问类中的静态成员,不能直接访问非静态成员;若要访问,必须通过参数传递的方式来获得相应的对象,再通过对象进行访问。
假如Display()是一个类中的静态成员函数,Point为类名,一般采用Point::Dispaly()的方式调用,而不是用对象.Display()。前者强调了Display()属于某一个类,而不是属于某一个对象。静态成员在类的任何对象建立之前就已经存在了。静态成员在程序内部不依赖于任何对象被访问,即就算没有创建对象,也可以通过类名访问类的公有静态成员。
上述静态成员特点4的详解
静态成员的初始化有些小问题,在类外定义了之后其实成员就被分配了内存,不初始化也不报错。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Student
{
public:
static int a;
};
int Student::a; //类外定义,不进行初始化,静态成员不能定义为局部变量
int _tmain(int argc, _TCHAR* argv[])
{
cout<<Student::a<<endl; //不报错,这里输出为0,即默认值是0
getchar();
return 0;
}
#include "stdafx.h"
#include <iostream>
using namespace std;
struct rectangle
{
int width;
int length;
};
class Polygon
{
public:
static rectangle rec;
};
rectangle Polygon::rec; //这种情形不知道怎么初始化,只能进行类外定义
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
ps:静态、非静态成员函数都可以访问静态数据成员。
网友评论