C++编程语言中类的静态成员介绍
本文主要介绍 C++ 编程语言中类的静态成员的相关知识,同时通过示例代码介绍类的静态成员的使用方法。
1 概述
在 C++ 编程语言中,可以使用 static 关键字来把类的成员声明为静态的。当将类的成员声明为静态时,就意味着无论创建多少个类的对象,该静态成员都只会存在一个副本。
2 静态成员变量
静态成员变量的初始化:不能把静态成员变量的初始化操作放在类的定义中,但可以在类的外部,通过使用作用域运算符“::”来重新声明静态成员变量从而对它进行初始化。
静态成员变量在类的所有对象中是共享的。
2.1 示例1
下面通过示例代码,介绍类的静态成员变量的特性。
示例代码(static_test1.cpp)的内容如下:
#include <iostream>using namespace std;class Box
{
public:// 声明静态成员变量static int objectCount;// 构造函数定义Box(double l=2.0, double b=2.0, double h=2.0){cout <<"Constructor called." << endl;length = l;breadth = b;height = h;// 每次创建对象时,静态成员变量 objectCount 加1objectCount++;}// 求立方体的体积double Volume(){return (length * breadth * height);}private:double length; // 长度double breadth; // 宽度double height; // 高度
};// (定义并)初始化类 Box 的静态成员变量
int Box::objectCount = 0;int main()
{Box Box1(3.3, 1.2, 1.5); // 创建对象box1Box Box2(8.5, 6.0, 2.0); // 创建对象box2// 输出已创建的对象的总数cout << "Total objects count is: " << Box::objectCount << endl;return 0;
}
编译并执行上述代码,运行结果如下:
通过示例代码及其运行结果,能够知道:
- 类 Box 中的静态成员变量 objectCount 是在类外手动进行的初始化,如果将该行注释掉,则会报错,错误信息如下:
这说明在上述示例代码中,创建对象时,类中的静态成员变量并未进行初始化; - 类 Box 中的的静态成员变量 objectCount 在对个对象中共用一个副本,所以创建两个对象后,objectCount 的值变为 2 了。
2.2 示例2
展示另外一个静态成员变量的用法示例,在本示例中,通过使用类的静态成员变量,能够跟踪类的构造与析构函数的调用情况。
示例代码(static_test2.cpp)的内容如下:
#include <iostream>using namespace std;class Cpoint
{
public:// 声明静态成员变量static int m_nConsTime;static int m_nDesTime;// 构造函数定义Cpoint(int x, int y){xp = x;yp = y;// 每次创建对象时,静态成员变量 m_nConsTime 加1m_nConsTime++;cout << "[Cpoint] Constructor called: " << m_nConsTime << endl;}// 析构函数定义~Cpoint(){// 每次调用析构函数时,静态成员变量 m_nDesTime 加1m_nDesTime++;cout << "[Cpoint] Destructor called:" << m_nDesTime << endl;}private:int xp;int yp;
};// (定义并)初始化类的静态成员变量
int Cpoint::m_nConsTime = 0;
int Cpoint::m_nDesTime = 0;class CRect
{
public:// 构造函数定义CRect(int x1, int x2):mpt1(x1, x2), mpt2(x1, x2){cout << "[CRect] Constructor called." << endl;}// 析构函数定义~CRect(){cout << "[CRect] Destructor called." << endl;}private:// 创建类Cpoint对象mpt1和mpt2Cpoint mpt1, mpt2;
};int main()
{// 创建类CRect对象pCRect p(10,20);cout << "Hello, world!" << endl;return 0;
}
编译并执行上述代码,运行结果如下:
3 静态成员函数
把类的成员函数声明为静态的,就可以把函数与类的任何特定对象独立开来。
类的静态成员函数的特点如下:
- 即使在类对象不存在的情况下,静态成员函数也能被调用——静态成员函数只要使用类名加作用域运算符“::”就可以访问了;
- 类的静态成员函数只能访问类的静态成员数据、类的其他静态成员函数和类外部的其他函数;
- 静态成员函数有一个类范围,它不能访问类的 this 指针;
- 可以使用静态成员函数来判断类的某些对象是否已被创建了;
- 静态成员函数是类的一部分,但是不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和作用域运算符“::”(如 Box::volume();),也可以通过对象名调用静态成员函数(如 a.volume();),但是这并不意味着此静态成员函数属于对象a(只是用了 a 的类型而已);
- 静态成员函数不属于对象,它与任何对象都是无关的,因此静态成员函数没有 this 指针,也就是说:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能直接访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员,因为静态数据成员同样是属于类的。当然,并不是说静态成员函数绝对不能访问本类中的非静态成员,只不过是不能进行默认访问(因为静态成员函数无法知道应该去找哪个对象的非静态成员),如果非要引用本类中的非静态成员,应该加上具体的对象名以及成员运算符“.”(例如:cout<<a.width<<endl)。
静态成员函数与普通成员函数的区别:
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针;
- 静态成员函数没有 this 指针,只能访问类的静态成员(包括静态成员变量和静态成员函数)、以及类外部的其他函数。
3.1 示例1
下面通过一个示例代码,理解一下类的静态成员函数的概念。
示例代码(static_test3.cpp)的内容如下:
#include <iostream>using namespace std;class Box
{
public:// 声明静态成员变量static int objectCount;// 构造函数定义Box(double l=2.0, double b=2.0, double h=2.0){cout <<"Constructor called." << endl;length = l;breadth = b;height = h;// 每次创建对象时 objectCount 加 1objectCount++;}// 求立方体的体积double Volume(){return (length * breadth * height);}// 获取已创建的类对象个数static int getCount(){return objectCount;}private:double length; // 长度double breadth; // 宽度double height; // 高度
};// (定义并)初始化类 Box 的静态成员变量objectCount
int Box::objectCount = 0;int main(void)
{// 创建对象前,输出已创建的对象的总数cout << "Inital Stage Count is: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5); // 创建对象box1Box Box2(8.5, 6.0, 2.0); // 创建对象box2// 创建对象后,输出已创建的对象的总数cout << "Final Stage Count is: " << Box::getCount() << endl;return 0;
}
编译并执行上述代码,运行结果如下:
通过上述示例及执行结果,能够看到,类 Box 的静态成员函数 getCount() 调用了该类的静态成员变量 objectCount 。
C++编程语言中类的静态成员介绍相关推荐
- C++中类的静态成员
1.Cpp中类的静态成员 可以使用static关键字来把类成员定义为静态的.当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本.静态成员在类的所有对象中是共享的.如果不 ...
- 【C++深度剖析教程5】C++中类的静态成员函数
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...
- 【C++深度剖析教程3】C++中类的静态成员变量
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 以一个简单的 ...
- Python基础——计算机组成原理、操作系统概述、编程语言的由来、编程语言分类、python介绍、 安装Cpython解释器、 第一个python程序
文章目录 一 引子: 1.1 什么是语言?什么是编程语言?为何要有编程语言? 1.2 什么是编程?为什么要编程? 二 计算机组成原理 2.1.什么是计算机? 2.2.为什么要用计算机? 2.3.计算机 ...
- python中类的详细介绍及使用
python中类的详细介绍及使用 前面我们介绍了类的创建及面向对象的三大特性.本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员包括:属性和方法. 属性可以分为: ...
- 【Shell 脚本速成】01、编程语言与 Shell 脚本介绍
目录 一.编程语言介绍 二.shell介绍 1.shell介绍 2.bash shell基本特性 2.1 命令和文件自动补全 2.2 常见的快捷键 3.shell脚本介绍 准确来说: 3.1 案例演示 ...
- C++中类的静态成员变量和静态成员函数
静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...
- Java 中类的静态成员与类的实例对象回收
对于一些Java程序员会误认为类中有静态成员声明,那么创建的对象就不能收回. 在一个类声明静态成员,那么在类加载的时候就会在静态区内创建和存储起来,静态成员只属于类,不属于某个实例对象:静态成员是脱离 ...
- Android中类ListPreference使用介绍
类ListPreference 一.概要: 1.XML属性 属性名称 相关方法 描述 android:entries 展现给用户的下拉列表的值 android:entryValues 展现的用户的选择 ...
- STEP 7中的编程语言介绍
STEP 7中有三种基本的编程语言:梯形图.语句表和功能框图,可以相互转换.通过安装软件包,还有其他编程语言,下面简单介绍一下. (1)顺序功能图 STEP 7使用的是S7 Graph,不是STEP ...
最新文章
- Oracle 10g新增DROP DATABASE命令
- json web token 实践登录以及校验码验证
- 【C 语言】结构体相关 的 函数 指针 数组
- java setsolinger_java socket 的参数选项解读(转)
- 给摩托车上个牌,却把自己干骨折了...
- HTML+CSS+JS实现 ❤️照相机快门图片动画特效❤️
- 360网神防火系统 配置端口映射_IIS配置证书端口443无法访问
- 前端学习/资源/工具网站
- Java程序性能优化:让你的Java程序更快、更稳定
- 桌游跑团用roll点器,可以自己设置色字的数量和种类
- 新品周刊 | 麦德龙中国推出800多款春节年货礼盒;瑞士莲推出两款软心巧克力礼盒...
- dhtmlxGantt standard vs dhtmlxGantt pro
- linux系统下面所有命令都失效了,显示bash: xxxxx: command not found...
- 突破淘宝对于 selenium 检测
- uva-10177 - (2/3/4)-D Sqr/Rects/Cubes/Boxes?
- 台式计算机调整显示亮度,台式电脑显示器屏幕亮度怎么调节?
- 12306怎样才能防止抢票?
- shadow:人工智能设计,一门自己生长的课
- 纤巧精干:爱普生六轴机器人
- 对接支付宝网站支付接口