C++ 类的静态成员

我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。

静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。


下面的实例有助于更好地理解静态成员数据的概念:

实例

#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;// 每次创建对象时增加 1objectCount++;}double Volume(){return length * breadth * height;}private:double length;     // 长度double breadth;    // 宽度double height;     // 高度
};// 初始化类 Box 的静态成员
int Box::objectCount = 0;int main(void)
{Box Box1(3.3, 1.2, 1.5);    // 声明 box1Box Box2(8.5, 6.0, 2.0);    // 声明 box2// 输出对象的总数cout << "Total objects: " << Box::objectCount << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Constructor called.
Constructor called.
Total objects: 2

静态成员函数

如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。

静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。

静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。

静态成员函数与普通成员函数的区别:

  • 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
  • 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。

下面的实例有助于更好地理解静态成员函数的概念:

实例

#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;// 每次创建对象时增加 1objectCount++;}double Volume(){return length * breadth * height;}static int getCount(){return objectCount;}private:double length;     // 长度double breadth;    // 宽度double height;     // 高度
};// 初始化类 Box 的静态成员
int Box::objectCount = 0;int main(void)
{// 在创建对象之前输出对象的总数cout << "Inital Stage Count: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5);    // 声明 box1Box Box2(8.5, 6.0, 2.0);    // 声明 box2// 在创建对象之后输出对象的总数cout << "Final Stage Count: " << Box::getCount() << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2

类和对象编程(九):类的静态成员相关推荐

  1. [C# 类和对象]-C# 中的方法以及类和对象编程

    ################################################## 目录 C# 的方法 C# 定义方法 访问修饰符 返回值类型 方法名 参数列表 方法主体 方法名的命 ...

  2. 本科课程【java程序设计】实验2 - 类与对象编程练习

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  3. (教学思路 c#之类一)声明类和对象、定义类成员及其引用

    上一节(教学思路 c#之面向对象二)初步理解面向对象的基本概念中,我没有提到任何的代码,只是用语言和实例来说明什么是类和对象以及面向对象的特性等基本概念,类是c#程序语言的重要核心,也是构建应用程序最 ...

  4. java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用

    java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用 七十年代,IBM的Smalltalk语言最先推广面向对象,后来C语言变为C++,后来C++又产生了J ...

  5. php 什么是对象,什么是PHP类和类的对象(PHP的类简介)

    什么是PHP类和类的对象(PHP的类简介) 类(Class):是一些变量与一些使用这些变量的函数的集合. 可简单理解为函数和变量的集合,或变量和函数的定义的集合. 语法是: class Class_n ...

  6. C#中什么是类,类和对象的关系,类的访问修饰符?

    类以及类和对象的关系以及类的访问修饰符 一.类的概念: 二.类和对象的关系: 三.类的组成: 四.类的创建: 五.类的访问修饰符: 一.类的概念: 类是对于某一类对象的一个统称,类是对象的抽象化,对象 ...

  7. python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...

  8. java类与对象 编程题目_Java类与对象的课后练习

    Java类与对象的课后练习编程题(java2实用教程P111) 这章内容自学完了,在做教材课后其他练习题的时候(只要自己仔细)都没啥问题,但在做最后一道上机编程题的时候问题出现了,在阅读题目的时候自己 ...

  9. Python基础学习——面向对象编程(第一讲:面向对象概述、面向对象三个基本特征(封装性、继承性、多态性)、类和对象(定义类、创建和使用对象、实例变量、类变量、构造方法、实例方法、类方法、静态方法))

    面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的. 1.面向对象概述 面向对象的编程思想是,按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建软件系 ...

最新文章

  1. python和c-Python与C的简单比较(Python3.0)
  2. C#基础-面向对象-多态
  3. 关于shader.createGPUProgram耗时较高的问题
  4. uvm 形式验证_这究竟属于下一代验证的方法、语言还是工具?||路科验证
  5. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK...
  6. LeetCode 933. 最近的请求次数(queue)
  7. python定义一个类savingaccount表示银行账户_c#教程之c#模拟银行atm机示例分享
  8. linux目录大小从大到小,linux系统下如何将当前目录下的文件从小到大排列
  9. 决策树系列(五)——CART
  10. Redux 入门 -- 处理 async action
  11. php呼叫平台,php – Twilio呼叫转发
  12. Jmeter二次开发实现rsa加密
  13. Windows驱动开发入门指引
  14. java编程思想第4版 第五章习题
  15. 优秀工程师必备的一项技能,你解锁了吗?
  16. 使用jupyter做数据分析与挖掘
  17. 关于【ROM制作工具】的那点事
  18. 软件工程实训有必要吗_软件工程专业有没有必要考研
  19. Zabbix配置网络流量监控报警
  20. 软件测试 - 功能测试Ⅱ

热门文章

  1. JavaScript对象快速入门
  2. 基于MATLAB的夜间车牌识别处理
  3. mysql flaskalchemy_python flask sqlalchemy 数据库mysql操作
  4. k8s安装sqlite3_使用sqlite3步骤
  5. springboot项目解决跨域的几种方式
  6. celery cluser redis_celery结合redis 使用
  7. 对象当前正在其他地方使用_2019 为什么我们还会继续使用 PHP ?
  8. 【我的相册】北方的传统面艺
  9. 远程服务器传数据库,怎样把本机的mysql数据库上传到远程主机上
  10. mysql——逗号分割字段情况