1.静态成员:在说明前面加上static关键字成员
普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。
sizeof运算符不会计算静态成员变量.
class cmyclass{
int n;
static int s;
};
//则sizeof 运算符不会计算静态成员变量
//则sizeof(cmyclass)等于4
普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用某个对象。
因此静态成员不需要通过对象就能访问。
2.访问静态成员
1)类型::成员名
crectangle::printoal();
2)对象名.成员名
crectangle r; r.printotal();
3)指针->成员名
crectangel *p=&r; p->printotal();
4)引用.成员名
crectangle &ref=r;int n=ref.ntotalnumber;
3.基本概念
静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
静态成员函数本质上是全局函数。
设置静态成员这种机制的目的时将和某些类紧密相关的全局变量和函数写到类里面,看上去像是一个整体,易于维护和理解。
4.静态成员变量
必须要在定义类的文件中对静态成员变量进行一次说明或者初始化。。否则编译能够通过,但是链接不能通过。
说明形式:int 类名::成员名=number;
5.在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
void crectangle::printtotal()
{
cout<<w<<","<<ntotalnumber<<","<<ntotalarea<<endl; //wrong
}
cretangle::printtotal(); //解释不同,w到底属于哪个对象的?
6.算法缺陷
crectangle::crectangle(int w_,int h_)
{
w=w_;
h=h_;
ntotalnumber++;
ntotalarea+=w*h;
}
crectangle::~crectangle()
{
ntotalnumber--;
ntotalarea-=w*h;
}
void crectangle::printtotal()
{
cout<<ntotalnumber<<","<<ntotalarea<<endl;
}
此类crectangle类写法,有何缺陷?
在使用crectangle类时,有时会调用复制构造函数生成临时的隐藏的crectangle对象。
1.调用一个一crectangle类对象作为参数的函数时
2.调用一个以crectangle类对象作为返回值的函数时
此时,由于没有写复制构造函数,编译器会自动生成一个复制构造函数,在自动生成的复制构造函数里边,没有对ntotaonumber和ntotalarea进行计算,而自动生成的默认构造函数的对象都会经过析构函数,析构函数里边却对这两个静态城成员变量进行了计算。所以结果是计算不正确的。
解决方法:为从rectangle写一个复制构造函数。
crectangle::crectangle(crectangle &r)
{
w=r.w;h=r.h;
ntotalnumber++;
ntotalarea+=w*h;
}```