- 要点:
- 静态成员变量和函数,相当于该类的全局变量和函数。
- 静态成员函数中不能包含非静态变量和函数。
- 静态成员,实际上不放在成员内部,而是放在所有成员的外面,被所有对象共享。即静态成员只与该类相关,与其他变量和成员基本上没有关系。
- 静态成员不需要通过对象就能访问。
- 静态成员函数不具体作用到某一具体对象上。
基本概念
1、静态成员
(1)在说明前面加了static关键字的成员。如下:
class CRectangle{
private:
int w,h;
//静态成员变量
static int nTotalArea;
static int nTotalNumber;
public:
CRectangle(int w_,int h_);
~CRectangle();
//静态成员函数
static void PrintTotal();
};
(2)sizeof不会计算静态成员变量。
(3)普通成员函数必须作用到类生成的某一具体对象上,而静态成员函数不具体作用到某一具体对象上。
2、访问静态成员
(1)类名::成员名
CRectangle::PrintTotal();
(2)对象名.成员名
CRectangle r;
r.PrintTotal();
(3)指针->成员名
CRectangle *p = &r;
p->PrintTotal();
(4)引用.成员名
CRectangle& rr = r;
int n = rr.nTotalArea;
3、注意要点
若对象是用复制构造函数生成的,而我们自己并没有写复制构造函数,可能造成程序结果出问题,因此最好还是自己编写复制构造函数。
#include <iostream>
using namespace std;
class CRectangle{
private:
int w,h;
//静态成员变量
static int nTotalArea;
static int nTotalNumber;
public:
static int nTotalTest;
CRectangle(int w_,int h_);
//拷贝构造函数
CRectangle(CRectangle& r);
~CRectangle();
//静态成员函数
static void PrintTotal();
};
CRectangle::CRectangle(int w_,int h_){
w = w_;
h = h_;
nTotalNumber ++;
nTotalArea += w+h;
}
//加一个拷贝构造函数,否则若对象是用复制构造函数生成的,而我们自己并没有写复制构造函数,
//可能造成程序结果出问题,因此最好还是自己编写复制构造函数。
CRectangle::CRectangle(CRectangle& r){
w = r.w;
h = r.h;
nTotalNumber ++;
nTotalArea += w+h;
}
CRectangle::~CRectangle(){
nTotalNumber --;
nTotalArea -= w+h;
}
void CRectangle::PrintTotal(){
cout<<nTotalNumber<<","<<nTotalArea<<endl;
}
//没有定义下面则编译不通过
int CRectangle::nTotalNumber = 0;
int CRectangle::nTotalArea = 0;
int CRectangle::nTotalTest = 1;
int main(){
CRectangle r1(3,3),r2(2,2);
CRectangle::PrintTotal();
//cout<<CRectangle::nTotalNumber<<endl; //上面定义nTotalNumber是私有的
cout<<CRectangle::nTotalTest<<endl;//公有的则可以访问
r1.PrintTotal();
return 0;
}