052day(静态成员)

来源:互联网 发布:条数计算java 编辑:程序博客网 时间:2024/06/10 03:45

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对象,

生产时,总数和总面积无变化,但消亡时,会调用析构函数,减少总的量;

因此,我们在这种情况下,会得到比实际值小的量;

自己写一个使增加总数和总面积的复制构造函数即可;


明日计划:成员对象和封闭类;