C++类的静态数据成员和静态成员函数

静态数据成员

·用关键字static声明

·当声明类的数据成员为静态时,无论创建多少个类的对象,静态成员都只有一个副本

·在类的所有对象中共享,具有静态生存期

·若不存在其他的初始化语句,在创建第一个对象时,所有的静态数据成员被初始化为零

立即学习“C++免费学习笔记(深入)”;

·在类外定义和初始化,用范围解析运算符(::)来指明所属的类

举例:

#include using namespace std;class Box {public:static int count;    //若该静态数据成员在private部分声明,则只能通过静态成员函数处理Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout << "One constructor was called." << endl;length = l, width = b, height = h;count++;//每创建一个对象时加1}double Volume() {return length * width * height;}~Box() { count--; }private:double length, width, height;};//初始化类Box的静态成员int Box::count = 0;int main(void) {Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);cout << "Total objects: " << Box::count << endl;//输出对象的总数return 0;}

静态成员函数

把成员函数声明为静态的,就可以把函数与类的任何特定对象独立开来

·在类对象不存在的情况下也能被调用,使用类名加范围解析运算符 :: 即可访问

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

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

·用静态成员函数访问非静态成员,需通过对象

举例:

#include using namespace std;class Box {public:static int count;Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout <<"One constructor was called." << endl;length = l, width = b, height = h;count++;}double Volume() {return length * width * height;}static int getCount() {//静态成员函数 return count;}private:double length, width, height;};int Box::count = 0;int main(void) {//在创建对象之前输出对象的总数cout << "Inital Stage Count: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);//在创建对象之后输出对象的总数cout << "Final Stage Count: " << Box::getCount() << endl;return 0;}

注:

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

·静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)

·普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针

使用静态成员了解构造与析构函数的调用情况

#include using namespace std;class A {friend class B;//类B是类A的友元 public:static int value;static int num;A(int x, int y) {xp = x, yp = y;value++;cout << "调用构造:" << value << endl;}void displayA() {cout << xp << "," << yp << endl;}~A() {num++;cout << "调用析构:" << num << endl;}private:int xp, yp;};class B {public:B(int x1, int x2) : mpt1(x1 + 2, x2 - 2), mpt2(x1, x2) {cout << "调用构造\n";//mpt是类A的对象,有几个mpt,有关类A的操作便执行几次 }void set(int m, int n);void displayB();~B() {cout << "调用析构\n";//析构函数在类结束前调用,类结束的时候释放类申请的空间} private:A mpt1, mpt2;//将A类的对象声明为B类的私有数据成员 };int A::value = 0;int A::num = 0;void B::set(int m, int n) {mpt1.xp = m * 2, mpt1.yp = n / 2;}void B::displayB() {mpt1.displayA();}int main() {B p(10, 20);cout << "Hello world!" << endl;B displayB();    //通过友元,使类B输出类A的私有数据成员return 0;}

相关文章:

C++静态成员与常成员的使用

C++复习要点总结之五静态成员变量及成员函数

以上就是C++类的静态数据成员和静态成员函数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432851.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 08:40:34
下一篇 2025年12月12日 21:03:24

相关推荐

  • C# 使用NPOI生成Word文档(按照模板)

    项目需要集成word导出,做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本操作分享给有需要的朋友。   本篇包括生成word对word文本的操作,表格的操作,以及图片的操作,都为生成word基础的一些操作。 以下只是我的个人理解所…

    好文分享 2025年12月17日
    000
  • C#入门经典学习阶段小结(凌乱)

    CLR: common language runtime(.net 公共语言运行库)管理.net库开发的所有应用程序的执行 cts: common type system (通用类型系统)指定最基本类型有助于使用.net framework的各种语言之间进行交互操作cil:common interm…

    好文分享 2025年12月17日
    000
  • 从事C/C++开发多年,给零基础想学习C/C++的几点建议

    我在C++领域也从事了好多年了,也是有一些经验心得的,想分享给那些零基础入门C语言的伙伴们。从C++入门到精通各需要学习什么以及注意事项,避免不必要的麻烦,也很浪费时间,经验交流,如有不足之处多多谅解,我也只是简单的介绍。apache php mysql 从事C/C++开发多年,给零基础想学习C/C…

    2025年12月17日
    000
  • 案例分享c++ map的使用和 查找性能测试

    最近在为推荐服务作性能调优,这个服务的主要逻辑是用离线计算的模型数据给请求中的每个广告打分,再返回这些广告的排序结果,这里面打分的过程其实就用请求中的数据拼成各种key,去查一个大的 map,这种计算非常多,成为了主要的性能瓶颈,代码比较老,使用的是 boost::unordered_map,为了解…

    好文分享 2025年12月17日
    000
  • 基于汇编的 C/C++ 协程(用于服务器)的实现

    本篇文章,是 对c++/c++ 协程的实现。我们需要实现这两个目标: 有同步式服务器编程的顺序思路,便于功能设计和代码调试——我使用了 libco 中的协程部分 有异步 I/O 的性能——我使用了 libevent 中的 event I/O     apache php mysql 结构上,就是将 …

    2025年12月17日 好文分享
    000
  • C++ 布尔类型和引用的用法详解

    1、布尔类型 c++kquote>C++中的布尔类型C++在C语言的基本类型系统之上增加了boolC++中的bool可取的值只有true和false理论上bool之占用一个字节注意:true代表真值,编译器内部用1来表示false代表非真值, 编译器内部用0来表示C语言中:用整型值来代替boo…

    2025年12月17日
    000
  • C++引用的意义与引用的本质

    1、引用的意义 引用作为变量别名而存在,因此在一些场合可以替代指针,引用相对于指针来说具有更好的可读性和实用性 // swap函数的实现对比void swap(int& a, int& b){ int t = a; a = b; b = t;}void swap(int* a, in…

    2025年12月17日
    000
  • 第一章C++:函数返回值、GNU编译器命令

    c++bce3b83f770dfdf50c5dae0e4360a>函数返回值 返回值类型必须和函数的返回类型相同 对于main函数,返回值必须是int型。大多数系统中,main函数的返回值是一个状态指示器。返回值为0表示main函数成功执行完毕;返回非零表示有错误出现。 GNU编译器命令 vi…

    好文分享 2025年12月17日
    000
  • 第二章C++:变量和基本类型

    c++bce3b83f770dfdf50c5dae0e4360a>介绍语言的基本知识和标准库 第二章 变量和基本类型 一些语言,如smalltalk和python等,在程序运行时检查数据类型;与之相反,c++是一种静态数据类型语言,它的类型检查发生在编译时。 – 内置类型(buil…

    好文分享 2025年12月17日
    000
  • 第三章C++:字符串string、向量vector和数组

    第二章介绍内置类型,本章介绍抽象数据类型库。  – 其中string和vector是两种最重要的标准库类型,前者支持可变长字符串,后者表示可变长的集合。 – 还有一种标准库类型是迭代器,它是string和vector的配套类型,常被用于访问string中的字符和vector中…

    好文分享 2025年12月17日
    000
  • 利用Unity脚本自定义分辨率实现相机截一张高清截图

    最近做项目的时候需要在游戏里截一张高清截图,研究了一下写成脚本,方便以后使用。脚本可以自定义分辨率,用相机截高清截图。可以用代码动态截图,也可以在编辑模式下截图。注意截图宽高比要正确,宽高比不正确时可能会出问题。 截图效果: 脚本:CameraCapture.cs using UnityEngine…

    2025年12月17日
    000
  • 技术解答CSV 文件的一个 .NET 库:CsvHelper 中文文档

    csvhelper 是读写 csv 文件的一个 .net 库。可以通过 visual studio 的包管理器下载 csvhelper。自动映射定义:没有提供映射文件的情况下,默认为自动映射,自动映射会按顺序依次映射到类的属性中去。 GitHub 地址 读取 读取所有的记录 var csv = ne…

    好文分享 2025年12月17日
    000
  • 简要分析Unity计时器脚本Timer的用法(附代码)

    计时器效果图: Timer用法:第一种:脚本加到物体上,勾选”自动计时”。第二种:脚本加到物体上,调用timer.start()方法启动。第三种:代码中动态添加Timer脚本。 using UnityEngine;public class TimerTest : MonoBe…

    2025年12月17日
    000
  • 常见的C++中const常量用法分析讲解

    先对c++语言中的const和c++中的const进行讲解,前者const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。后者c++在c的基础上对const进行了进化处理。 1、C语言中的const: const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上…

    好文分享 2025年12月17日
    000
  • 深入理解C#设计模式之策略模式 角色具体案例分享

    策略模式(Stragety Pattern) 策略模式属于行为型模式,它定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。 使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。 角色: 1、抽象策略(S…

    2025年12月17日
    000
  • 最新使用C#生成二维码方案,详解及实例 ( QRCoder )

    不知道大家有制作多二维码吗?本篇文章我将给大家介绍如何用c#生成二维码,先说一下生成二维码需要的三个类qrcodegenerator、qrcodedata、qrcode。供后面好理解。他们的 职责 分别是什么呢?qrcodegenerator :用来通过指定的方式生成二维码存储的数据对象,也就是 q…

    2025年12月17日 好文分享
    000
  • 精选的这19道C/C+面试题,你能答对多少呢? – 个人文章 思否

    c++和c++的区别?答:c++在c的基础上增添类,c是一个结构化语言,它的重点在于算法和数据结构。软件工程师的面试,套路都差不多,这一次约到的问题,下次你可能还会遇到。 问1:请用简单的语言告诉我C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程…

    好文分享 2025年12月17日
    000
  • 最新总结C语言中关于指针等相关理解和使用事宜

    定义:指针是一个变量,其值是另一个变量的地址,地址代表的是在内存中的位置。需要记住的是,数组变量本身就是一个指针。 地址的类型 地址是存在类型的,是不是感觉好奇怪,指针不是代表一个地址的吗,地址还有类型吗?看一个例子: int *ip; /* 一个整型的指针 */double *dp; /* 一个 …

    好文分享 2025年12月17日
    000
  • 详细介绍C# 中 ASP.NET Web API 的 ROC

    web api 是一个 面向资源(ROC)  通过 HTTP协议动词来修改资源状态的可自我寄宿(SelfHost)的接口今天 seaconch 的主要目的是实现一个简单的 ASP.NET Web API 栗子 什么是Web API 谈谈rest与asp.net web api 怎样理解 REST、R…

    2025年12月17日 好文分享
    000
  • 原来斐波拉契数列还有这种写法,你知道吗?

    百度下“斐波拉契的非递归写法”,也有不少的答案,但是并不令人满意,首先是太复制难懂,其次是性能和递归差不多。 一说到斐波拉契数列,无论是程序菜鸟,还是技术老手,首先想到的,肯定是递归写法。然后,技术老手与程序菜鸟不同的地方,就是会想到将递归的结果存起来以减少重复计算。这些都是些很常规的操作,但是你有…

    好文分享 2025年12月17日
    000

发表回复

登录后才能评论
关注微信