C++学习:类的静态成员变量与静态成员函数

编程入门 行业动态 更新时间:2024-10-23 11:24:08

C++学习:类的<a href=https://www.elefans.com/category/jswz/34/1771395.html style=静态成员变量与静态成员函数"/>

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++学习:类的静态成员变量与静态成员函数

本文发布于:2023-12-03 07:34:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1652718.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   成员   变量   函数

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!