本文主要介绍 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++编程语言中类的静态成员介绍相关推荐

  1. C++中类的静态成员

    1.Cpp中类的静态成员 可以使用static关键字来把类成员定义为静态的.当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本.静态成员在类的所有对象中是共享的.如果不 ...

  2. 【C++深度剖析教程5】C++中类的静态成员函数

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  3. 【C++深度剖析教程3】C++中类的静态成员变量

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 以一个简单的 ...

  4. Python基础——计算机组成原理、操作系统概述、编程语言的由来、编程语言分类、python介绍、 安装Cpython解释器、 第一个python程序

    文章目录 一 引子: 1.1 什么是语言?什么是编程语言?为何要有编程语言? 1.2 什么是编程?为什么要编程? 二 计算机组成原理 2.1.什么是计算机? 2.2.为什么要用计算机? 2.3.计算机 ...

  5. python中类的详细介绍及使用

    python中类的详细介绍及使用 前面我们介绍了类的创建及面向对象的三大特性.本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员包括:属性和方法. 属性可以分为: ...

  6. 【Shell 脚本速成】01、编程语言与 Shell 脚本介绍

    目录 一.编程语言介绍 二.shell介绍 1.shell介绍 2.bash shell基本特性 2.1 命令和文件自动补全 2.2 常见的快捷键 3.shell脚本介绍 准确来说: 3.1 案例演示 ...

  7. C++中类的静态成员变量和静态成员函数

    静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...

  8. Java 中类的静态成员与类的实例对象回收

    对于一些Java程序员会误认为类中有静态成员声明,那么创建的对象就不能收回. 在一个类声明静态成员,那么在类加载的时候就会在静态区内创建和存储起来,静态成员只属于类,不属于某个实例对象:静态成员是脱离 ...

  9. Android中类ListPreference使用介绍

    类ListPreference 一.概要: 1.XML属性 属性名称 相关方法 描述 android:entries 展现给用户的下拉列表的值 android:entryValues 展现的用户的选择 ...

  10. STEP 7中的编程语言介绍

    STEP 7中有三种基本的编程语言:梯形图.语句表和功能框图,可以相互转换.通过安装软件包,还有其他编程语言,下面简单介绍一下. (1)顺序功能图 STEP 7使用的是S7 Graph,不是STEP ...

最新文章

  1. Oracle 10g新增DROP DATABASE命令
  2. json web token 实践登录以及校验码验证
  3. 【C 语言】结构体相关 的 函数 指针 数组
  4. java setsolinger_java socket 的参数选项解读(转)
  5. 给摩托车上个牌,却把自己干骨折了...
  6. HTML+CSS+JS实现 ❤️照相机快门图片动画特效❤️
  7. 360网神防火系统 配置端口映射_IIS配置证书端口443无法访问
  8. 前端学习/资源/工具网站
  9. Java程序性能优化:让你的Java程序更快、更稳定
  10. 桌游跑团用roll点器,可以自己设置色字的数量和种类
  11. 新品周刊 | 麦德龙中国推出800多款春节年货礼盒;瑞士莲推出两款软心巧克力礼盒...
  12. dhtmlxGantt standard vs dhtmlxGantt pro
  13. linux系统下面所有命令都失效了,显示bash: xxxxx: command not found...
  14. 突破淘宝对于 selenium 检测
  15. uva-10177 - (2/3/4)-D Sqr/Rects/Cubes/Boxes?
  16. 台式计算机调整显示亮度,台式电脑显示器屏幕亮度怎么调节?
  17. 12306怎样才能防止抢票?
  18. shadow:人工智能设计,一门自己生长的课
  19. 纤巧精干:爱普生六轴机器人
  20. 对接支付宝网站支付接口

热门文章

  1. 小程序自定义图片预览和多图下载的实现
  2. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...
  3. Volley 源码分析
  4. Linux-MySQL主从配置
  5. 变量的数据类型和类型转换(二)
  6. 微信蓝牙协议二:1800 or 18914E结尾和Varint压缩算法
  7. python 并发编程 多线程 守护线程
  8. 3ds max学习笔记(二)--查看视点
  9. 人生的第一个js插件
  10. javascript实例:路由的跳转