C++类的静态成员详解:成员函数非静态成员函数的非法调用
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
静态成员的定义或声明要加个关键static。静态成员可通过双冒号来使用<类名>::<静态成员名>。
在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻的认识。
例1:
class Point{
public:
void init(){
//...}static void output(){
//...}
};int main(){Point::init(); //作用域调用非静态成员函数Point::output(); //作用域调用静态成员函数return 0;
}
编译出错:error C2352: 'Point::init' : illegal call of non-static member function
结论1:不能通过类名来调用类的非静态成员函数。
正确写法为以下代码:
class Point {
public:void init() {//...}static void output() {//...}
};int main() {Point p1; //实例化对象p1.output(); //只能通过对象调用非静态函数Point::output(); //作用域调用静态成员函数return 0;}
编译通过。
结论2:类的对象可以使用静态成员函数和非静态成员函数。
例2:
#include <stdio.h>
class Point{public:void init(){}static void output(){printf("%d ", m_x); //err}private:int m_x;};int main()Point pt;pt.output();return 0;
}
编译出错:error C2597: illegal reference to data member 'Point::m_x' in a static member function
因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。
结论3:静态成员函数中不能引用非静态成员。
例3:
class Point{public:void init(){output();}static void output(){}
};int main(){Point pt;pt.output();return 0;}
编译通过。
结论4:类的非静态成员函数可以调用用静态成员函数,但反之不能。
例4:
class Point{public:Point(){m_nPointCount++;}~Point(){m_nPointCount--;}static void output(){printf("%d ", m_nPointCount);}private:static int m_nPointCount;
};int main(){Point pt;pt.output();return 0;
}
编译错误!
这是因为类的静态成员变量在使用前必须先初始化。在main()函数前加Point::m_nPointCount = 0; 再编译链接无错误,运行程序将输出1。
改正:
class Point {
public:Point() {m_nPointCount++;}~Point() {m_nPointCount--;}static void output() {printf("%d ", m_nPointCount);}
private:static int m_nPointCount;};
//类静态成员变量初始化赋值
int Point:: m_nPointCount = 0;int main() {Point pt;pt.output();return 0;
}
编译+运行通过
结论5:类的静态成员变量必须先初始化再使用。
总结:
结论1:不能通过类名来调用类的非静态成员函数。
结论2:类的对象可以使用静态成员函数和非静态成员函数。
结论3:静态成员函数中不能引用非静态成员。
结论4:类的非静态成员函数可以调用用静态成员函数,但反之不能。
结论5:类的静态成员变量必须先初始化再使用。
相关文章:
C++类的静态成员详解:成员函数非静态成员函数的非法调用
在C中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要…...
Qt之滑动条和进度条(QSlider、QProgressBar)
文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中,滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中,QSlider是…...
Flutter之插件开发plugin
目的:适用于独立业务模块,或者与原生页面交互频繁的地方。 基于flutter3.x , IDE :androidStudio demo:https://download.csdn.net/download/SHTLoveXX/87751845 步骤: 1.新建flutter project 【New flutter project】. 2. 在新建工程面板记得切换 …...
asp.net基于web的音乐管理网站dzkf17A9程序
本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块:管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块:用户登录本系统,对个…...
itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析
《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似,GPIO 在设备树中也存在两层定义,首先是 GPIO 控制器,这部分由芯片原厂工程师编写,相当于 GPIO 底层…...
函数(定义、返回值、调用、参数)
目录 ❤ 无参函数 ❤ 有参函数 ❤ 空函数 ❤ 什么是返回值? ❤ 为什么要有返回值? ❤ 什么是函数调用? ❤ 为何用调用函数? ❤ 函数调用的三种形式 ❤ 形参和实参 形参 实参 ❤ 位置参数 位置形参 位置实…...
28. Kubernetes 核心组件讲解——API Server
本章讲解知识点 Kubernetes API Server 概述etcd 简介API Server 架构解析API Server 的 List-Watch 机制独特的 Kubernetes Proxy API 接口集群功能模板之间的通信1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server(API Server)是 Kubernetes 的核心组件…...
springboot框架开发医院云HIS 住院医生站、住院护士站功能实现
住院医生站主模块:包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 (1)医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作; ②医嘱类型含药品、项目、材料、嘱托; ③支持住院各…...
高性能定时器介绍及代码逐行解析--时间堆
简介 在《Linux高性能服务器编程》中,介绍了三种定时方法: socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 基础知识 非活跃,是指客户端(这里是浏览器)与服务器端建立连接后,…...
汇编语言学习笔记五
div指令 除法, 被除数:默认是放在ax或者dx中,其位数为16位,则在ax中,如位数为32位,则高位在dx中,低位在ax中 除数:放在寄存器或者内存单元中,有8位和16位两种。 结果&am…...
Linux下的epf 是什么?
EPF (Extended Page Frame) 是 Linux 内核中的一个功能,它用于管理大内存系统中的物理页框。具体来说,当系统中的物理内存超过 1TB 时,传统的页表结构会变得非常庞大和复杂,给内存管理带来很大的困难。 EPF 架构通过将物理地址分…...
如何在广告形式选择上化解用户厌恶和变现瓶颈?
用户讨厌广告,这似乎是一个共识。在日复一日的使用中,用户会遇到各种各样的广告形式,从搜索结果中的广告链接,到视频中不间断的广告,再到流行应用中的推广内容。 无处不在的广告已经让用户不胜其烦,这也…...
【Android入门到项目实战-- 9.2】—— 传感器实战使用教程(靠近黑屏和计步器)
上篇文章介绍了传感器的基础用法(如有需要,可先移步),下面将通过两个实战案例学习具体如何使用。 一、靠近黑屏 这是距离传感器的简单应用。 –检测手机是否贴在耳朵上正在打电话,以便自动熄灭屏幕达到省电的目的。也…...
软件项目生命周期模型
目录 瀑布模型 快速原型模型 敏捷模型 迭代模型(增量模型) 螺旋模型 瀑布模型 定义:早就计划好了,按计划顺序(计划、设计、开发、测试、维护)线性执行 适用于:需求明确、变化少的项目 缺…...
linux系统TP-ti,tsc2046外设调试
一、整体调试思路 tp外设属于比较常见且比较简单的外设,今天以ti,tsc2046这款为例简述下tp外设的调试。 整体思路 1、配置设备树----驱动调试的device部分 2、tp驱动编译及匹配—driver部分 3、驱动整体调试 二、配置设备树 对于ti,tsc2046我们可以参考内核Docum…...
ChatGPT指令大全
1. 写报告:我现在正在 [报告的情境与目的]。我的简报主题是 [主题],请提供 [数字] 种开头方式,要简单到 [目标族群] 能听懂,同时要足够能吸引人,让他们愿意专心听下去。 2. 研究报告:写出一篇有关 [知识] …...
【Vue面试题】Vue2.x生命周期?
文章目录 1.有哪些生命周期(系统自带)?beforeCreate( 创建前 )created ( 创建后)beforeMount (挂载前)mount (挂载后)beforeUpdate (更新前)updated (更新后)beforeDestroy(销毁前)destroy(销毁后…...
运算放大器 - 笔记 02 -恒流源
恒流源 / 电流源 一、方案一二、方案二三、方案三四、方案四 前言:最近在学习运放,三极管,二极管,场效应管等器件的组合电路。捡起了以前的模电知识,写下笔记,以防再度忘记。 本文使用Multisim仿真软件进行…...
Python:Python进阶:Python字符串驻留技术
Python字符串驻留技术 1.什么是字符串驻留2. 为什么要驻留字符串3. Python的字符串驻留4. Python 字符驻留原理4.1 如何驻留字符串4.2 如何清理驻留的字符串 5. 字符串驻留的实现5.1. 变量、常量与函数名5.2 字典的键5.3 任何对象的属性5.4 显式地驻留 6 字符串驻留的其他发现 …...
2022年 全国职业院校技能大赛(中职组)网络安全赛项 正式赛卷 A模块 做题记录
评分标准文件及环境 评分标准:ZZ-2022029 网络安全赛项正式赛卷.zip 自己做的Linux靶机: 自己做的Windows靶机: 文章目录 评分标准文件及环境A-1 任务一 登录安全加固1. 密码策略(Windows,Linux)a. 最小密…...
终极QMC解码器实战指南:3分钟快速解锁QQ音乐加密文件
终极QMC解码器实战指南:3分钟快速解锁QQ音乐加密文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了QQ音乐平台的歌曲,却发现文件…...
OpenCode 的工具体系:给大模型装上操控代码库的“手”与“眼
要在代码库里真正帮上忙,光有聪明的脑子还不够,大语言模型(LLM)还需要能够执行具体操作的“工具”。OpenCode 把这些工具视为模型与项目环境之间的纽带——读取文件、修改代码、运行命令、查文档,甚至主动上网搜索&…...
GetQzonehistory:3分钟永久备份你的QQ空间青春回忆,告别数据丢失焦虑
GetQzonehistory:3分钟永久备份你的QQ空间青春回忆,告别数据丢失焦虑 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心过QQ空间里那些珍贵的青春回…...
Stryker.NET在CI/CD中的应用:如何在DevOps流水线中集成变异测试
Stryker.NET在CI/CD中的应用:如何在DevOps流水线中集成变异测试 【免费下载链接】stryker-net Mutation testing for .NET core and .NET framework! 项目地址: https://gitcode.com/gh_mirrors/st/stryker-net Stryker.NET是一款强大的.NET变异测试工具&…...
边缘计算中的3D占据映射技术与Gleanmer SoC优化
1. 边缘计算时代的3D占据映射技术革新在自动驾驶汽车穿越复杂城市道路时,在AR眼镜试图将虚拟物体精准叠加到现实场景时,设备都需要实时理解周围环境的3D结构。传统解决方案如激光雷达点云只能提供稀疏的空间采样,而基于体素的OctoMap虽然能构…...
Godot MCP服务器:AI助手与游戏开发工作流的高效集成方案
1. 项目概述:为什么我们需要一个更好的Godot MCP?如果你是一个Godot引擎的开发者,尤其是当你尝试将AI能力集成到你的游戏开发工作流中时,你很可能听说过或者用过MCP(Model Context Protocol)。简单来说&…...
从mekong-cli看现代CLI工具的设计哲学与工程实践
1. 项目概述:一个命令行工具能做什么?在开发者的日常工作中,命令行界面(CLI)是我们与计算机系统交互最直接、最高效的桥梁。无论是自动化部署、批量处理文件,还是与远程API进行交互,一个设计精良…...
ARM架构FPU识别与FPSID寄存器详解
1. ARM浮点系统识别基础在ARM架构中,浮点运算单元(FPU)的实现经历了从VFPv1到VFPv4的演进过程。FPSID寄存器作为浮点系统的"身份证",提供了识别FPU实现特性的标准方式。这个32位寄存器包含了多个关键字段,每个字段都承载着特定的识…...
GPU加速向量搜索实战:cuVS核心原理与CAGRA算法应用
1. 从CPU到GPU:向量搜索的范式转移与cuVS的诞生如果你最近在折腾大模型应用、推荐系统或者任何需要处理海量高维数据的项目,那么“向量搜索”这个词对你来说一定不陌生。简单来说,它就是把文本、图片、音频这些非结构化数据,通过模…...
2026年,想要靠谱美缝团队?看完这篇你就知道选哪家!
在高端住宅、别墅装修中,美缝是彰显整体质感的关键环节。选对美缝团队,不仅能提升家居美观度,还能确保美缝效果长效耐用。2026年,如果你正在寻找靠谱的美缝团队,不妨看看长沙匠心徐师傅美缝团队,以下将为你…...
