C++笔记10

静态成员##

在定义前加了static关键字的成员

class CRectangle
{
private:
int w,h;
static int nTotalArea;//静态成员变量,改了1的2的也跟着被修改
public:
static void PrintTotal();//静态成员函数
};

①普通成员变量每个对象有各自的一份,而静态成员变量一共就一分,为所有对象所共享。
·sizeof运算符不会计算静态成员变量

class CMyclass{
int n;
static int s;
};
则sizeof(CMyclass)=4

②普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象
因此静态成员不需要通过对象就能访问,因为不具体作用于某个对象

如何访问静态成员###

①类名::成员名
CRectangle::PrintTotal()
②对象名.成员名
CRectangle r;r.PrintTotal();//并不意味着PrintTotal作用在r上面,只是一种形式。不具体属于某个对象
③指针->成员名
CRectangle *p=&r;p->PrintTotal();
④引用.成员名
CRectangle & ref=r;int n=ref.nTotalNumber;

静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在

静态成员函数本质上是全局函数

目的是将和某些类紧密相关的全局变量和函数写到类里,看上去像一个整体,易于维护和理解
exp.

class CRectangle
{
private:
int w,h;
static int nTotalArea;
static int nTotalNumber;
public:
CRectangle(int w_,int h_);
~CRectangle();
static void PrintTotal();
};

在C++里,静态成员变量必须拿到所有函数外面单独申明一下,可以对其进行初始化,也可以不用
exp.

int CRectangle::nTotalNumber=0;
int CRectangle::nTotalArea=0;//单独的申明

int main()
{
Crectangle r1(3,3),r2(2,2);
//cout<<CRectangle::nTotalNumber;//Wrong,私有
CRectangle::PrintTotal();
r1.PrintTotal();
return 0;
}

输出:
2,13
2,13

att.在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数
exp.

void CRectangle::PrintTotal()
{
cout<<w(非静态成员变量,不能输出)<<","<<nTotalNumber<<","<<nTotalArea<<endl;//wrong解释不通w到底是属于哪个对象的
}

在使用A类时,有时会调用复制构造函数生成临时的隐藏的A对象

调用一个以A类对象作为参数的函数时
调用一个以A类对象作为返回值的函数时
生成的时候没有增加总数但是减少的时候总数却减少

解决办法:
由于问题出在复制构造函数上面,所以我们可以为这个A类写一个复制构造函数

posted @ 2020-02-07 12:19  AirBirdDD  阅读(59)  评论(0)    收藏  举报