静态成员变量与静态成员函数"/>
C++学习:类的静态成员变量与静态成员函数
this指针
类的对象有成员变量和成员函数构成,从程序运行的角度,独享是由数据和函数构成的,数据可以位于栈、堆、全局数据区;函数只能位于代码段,所有的对象共享一套成员函数。
成员函数能直接访问对象的属性(成员变量),是因为成员函数中有一个隐藏参数this指针,用于指代当前的对象。
#include <iostream>using namespace std;class Test
{
private:int mi;public://有参构造函数Test(int i){mi = i;}//拷贝构造函数Test(const Test& t){}//返回miint getMi(){return mi;}//打印this指针void print(){cout << "this = " << this << endl;}};int main()
{Test t1(1);Test t2(2);Test t3(3);cout << "t1.getMi() = " << t1.getMi() << endl;cout << "&t1 = " << &t1 << endl;t1.print();cout << endl;cout << "t2.getMi() = " << t2.getMi() << endl;cout << "&t2 = " << &t2 << endl;t2.print();cout << endl;cout << "t3.getMi() = " << t3.getMi() << endl;cout << "&t3 = " << &t3 << endl;t3.print();cout << endl;return 0;
}
输出结果
t1.getMi() = 1
&t1 = 0x64fe0c
this = 0x64fe0ct2.getMi() = 2
&t2 = 0x64fe08
this = 0x64fe08t3.getMi() = 3
&t3 = 0x64fe04
this = 0x64fe04
结果分析:
通过结果可以看出打印的this指针与对象的地址是一样的,这个this指针是一个隐藏的参数。
静态成员变量
我们知道对象的成员变量一般不能被外界所访问,每个对象有自己独立的一套成员变量,那有没有可能在类中高一个成员变量,让所有对象共享这个成员变量,这就需要静态成员变量。
静态成员变量的特征:
1、静态成员变量属于整个类所有,而不是某个对象;
2、静态成员变量的生命周期不依赖于任何对象;
3、可以通过类名直接访问公有的静态成员变量;
4、所有对象共享类的静态成员变量;
5、可以通过对象名访问公有的静态成员变量;
6、静态成员变量需要再类的外面单独分配空间;
7、静态成员变量在程序内部位于全局数据区;
静态成员变量的
比如要统计在程序运行期间某个类的对象数目,不使用全局变量,还要随时获取当前类对象的数目。可以通过下面的代码来实现
头文件
#ifndef COUNT_H
#define COUNT_Hclass Count
{
private:static int mCount; //定义一个静态成员变量
public:Count();~Count();int getCount();
};#endif // COUNT_H
源文件
#include "count.h"//用初始化列表将mCount初始化为0
Count::Count()
{mCount++; //每定义一个对象,就会调用构造函数
}Count::~Count()
{mCount--;//每删除一个对象,就会调用析构函数
}//返回在运行的对象数目
int Count::getCount()
{return mCount;
}
应用
#include <iostream>
#include "count.h"
using namespace std;Count gc; //定义一个全局对象int Count::mCount = 0; //静态成员变量初始化int main()
{Count c1; //定义一个局部对象Count c2;//定义一个局部对象cout << gc.getCount() << endl; //应该输出3cout << c1.getCount() << endl; //应该输出3cout << c2.getCount() << endl; //应该输出3Count* pt = new Count();cout << pt->getCount() << endl; //应该输出4delete pt;cout << gc.getCount() << endl; //应该输出3return 0;
}
静态成员函数
上面的代码能实现:
1、统计程序运行期间类的对象的数目;
2、不使用全局变量
但是不能实现随时获取对象的数目
每次获取对象数目的时候都需要调用getCount()这个函数,但是如果程序中一个对象都没有定义,也应该能获取对象的数目是0,但是对象都没有了,怎么调用getCount()这个函数?
我们需要不依赖对象就可以访问静态成员变量,还要保证静态成员变量的安全性,此时就需要静态成员函数,静态成员函数有如下特征:
1、静态成员函数时类中特殊的成员函数;
2、静态成员函数属于整个类所有;
3、可以通过类名直接访问公有的静态成员函数;
4、可以通过对象名访问公有的静态成员函数。
5、静态成员函数可以通过类名直接访问;
6、静态成员函数只能直接访问静态成员变量。
将关键字static加在成员函数前就变成静态成员函数了。
修改上面代码的头文件,就是在int getCount()前面加个static;
#ifndef COUNT_H
#define COUNT_Hclass Count
{
private:static int mCount; //定义一个静态成员变量
public:Count();~Count();static int getCount(); //声明静态成员函数
};#endif // COUNT_H
应用代码,使用类名来调用静态成员函数,不依赖于特定的对象。
#include <iostream>
#include "count.h"
using namespace std;int Count::mCount = 0; //静态成员变量初始化int main()
{//通过类名来调用静态成员函数cout << Count::getCount() << endl; //应该输出0Count c1; //定义一个局部对象Count c2;//定义一个局部对象cout << Count::getCount() << endl; //应该输出2Count* pt = new Count();cout << Count::getCount() << endl; //应该输出2delete pt;return 0;
}
这样,统计在程序运行期间某个类的对象数目的代码就结束了,满足全部需求。
更多推荐
C++学习:类的静态成员变量与静态成员函数
发布评论