172210704111-陈国佳总结《2017年12月1日》【连续052天】
标题:静态成员;
内容:A.静态成员:
static 变量/函数;
静态成员变量只有一份,为所有对象共享;
sizeof 运算符不会计算静态成员变量。(sizeof(类)没有计算),(因为静态成员变量可以看作是所有对象之外的变量);
静态成员函数并不具体作用于某个对象。
静态成员不需要通过对象进行访问;
B.访问静态成员:
1)类名::成员名
2)对象名.成员名 //与对象无关
3)指针->成员名 //与指针指向的对象无关
4)引用.成员名 //与引用的对象无关
C.基本概念:
静态成员变量本质上是全局变量,与对象存在与否无关;
静态成员函数本质上是全局函数。
D.示例:
设置一个可以随时知道矩形总数和总面积的图形处理程序;
class CR
{
private:
int w,h;
static int nTotalArea;
static int nTotalNumber;
public:
CR(int w_,int h_);
~CR();
static void PrintTotal();
};
CR::CR(int w_,int h_)
{
w=w_;h=h_;
nTotalNumber ++;
nTotalArea +=w*h;
}
CR::~CR()
{
nTotalNumber --;nTotalArea -=w*h;
}
void CR::PrintTotal()
{
cout<<nTotalNumber<<","<<nTotalArea<<endl;
}
int CR::nTotalNumber=0;
int CR::nTotalArea=0;
int main()
{
CR r1(3,3),r2(2,2); //cout<<CR::nTotalNumber; wrong,私有
CR::PrintTotal();
r1.PrintTotal();
return 0;
}输出:2,13
2,13
注意:静态成员函数不能访问非静态成员函数变量,也不能调用非静态成员函数:(无法解释变量所属的对象)
注:上述的程序有严重缺陷:
由于我们为定义复制构造函数,所以编译器会自动生产缺省的复制构造函数,该复制构造函数只完成复制工作;
但:调用一个以CR类对象作为参数或返回值的函数时,会通过复制构造函数生产一个临时的CR对象,
生产时,总数和总面积无变化,但消亡时,会调用析构函数,减少总的量;
因此,我们在这种情况下,会得到比实际值小的量;
自己写一个使增加总数和总面积的复制构造函数即可;
明日计划:成员对象和封闭类;