静态成员变量和静态成员函数
- 基本概念
- 静态成员:在说明前面加了static关键字的成员
static int a;
static void PrintTotal();
- 静态成员变量与普通成员变量的区别:普通成员变量每个对象各自有一份,而静态成员变量一共就一份,为所有对象共享。
sizeof
运算符不会计算静态成员变量
class CMyclass{
int n;
static int s;}
则sizeof(CMyclass)
=4
- 静态成员函数与普通成员函数的区别:普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象
- 静态成员(包括静态成员变量和静态成员函数)不需要通过对象就可以访问
- 如何访问静态成员
- 类名::成员名
CRctangle ::PrintTotal();
- 对象名.成员名
CRctangle r;r.PrintTotal();
注意:不是作用于对象r - 指针->成员名
CRctangle *p=&r;p->PrintTotal();
注意:不是作用于对象r - 引用.成员名
CRctangle &ref=r;int n=ref.nTotalNumber;
- 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在
- 静态成员函数本质上是全局函数
- 设置静态成员这种机制的目的是将和某些类紧密相关的全局变量和函数写到类里面,使之看上去像一个整体,易于维护和理解
- 必须在定义类的文件中对静态成员变量进行一次说明或初始化,否则编译能通过,链接通不过
int CRctangle::nTotalNumber=0;
- 注意事项
- 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数
设w
为普通成员变量
void CRctangle::PrintTotal()
{ cout<<w<<endl;}
w
是普通成员变量,而静态成员函数不作用于具体对象,则w
不知道是哪个对象的,因此值也不知道- 不能调用非静态成员函数原因:非静态成员函数中可能会访问到非静态成员变量,所以也不行。
this指针
设在类Complex
中有成员函数void A (int p){price=p;}
等价于C语言中有全局函数void A (struct Complex *this,int p){this->price=p;}
- 作用:
- 指向成员函数所作用的对象
- 非静态成员函数可以直接使用
this
来代表指向
- this指针和静态成员函数
- 静态成员函数中不能使用
this
指针 - 因为静态成员函数并不具体作用于某个对象
- 因此静态成员函数的真实的参数的个数就是程序中写出的参数个数