静态成员:不管这个类创建了多少个对象,静态成员在内存中只保留一份,静态成员用来解决同一个类中不同对象之间数据成员和函数的共享问题。
1、静态成员函数是用关键词static声明的成员函数,它属于整个类而并不属于类的某个对象。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
由于静态函数是独立于类对象而存在的,因此静态成员函数中没有this指针。所以静态成员函数不可以直接访问类中的非静态成员,但是可以直接访问静态成员。
若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。
class B{
private:
int x;
int y;
static int count;
public:
B():x(0), y(0){
count++;
}
B(int xx, int yy):x(xx), y(yy){
count++;
}
static int getObjCount();
};
int B::count = 0;
int B::getObjCount(){
return count;
}
int main()
{
cout << B::getObjCount() << endl;
B b1;
B b2(10, 20);
cout << b1.getObjCount() << endl;
cout << b2.getObjCount() << endl;
cout << B::getObjCount() << endl;
B *p = new B;
cout << p->getObjCount()<< endl;
return 0;
}
静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为所属类类型的 指针或引用。举例如下:
class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};
2、常成员函数
返回类型 成员函数名 (参数表) const ;
在定义时使用const关键字修饰的用于访问类的常对象函数,成为常成员函数。
常成员函数不能更新对象的数据成员,也不能调用该类中的没有用const修饰的成员函数,但可以被其他成员函数调用。
常对象只能调用常成员方法,而不能调用其他的成员函数。
const关键字可以用于对重载函数的区分
class CDate
{
private:
int y;
int m;
int d;
public:
int year()const;
int month() const;
int day(){return d++ ;}
//int day()const {return d;}
int AddYear(int i){return y+1;}
};
int CDate::year()const
{
return y;
}
int CDate::month()const
{
return m;
//return m++; 错误:常成员函数中不能更新类的数据成员
}
int main()
{
CDate const date;
//int day = date.day(); 错误常对象不能调用非常成员函数
int year = date.year();
}