当前位置: 首页 > news >正文

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中&#xff0c;静态成员是属于整个类的而不是某个对象&#xff0c;静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则&#xff0c;保证了安全性还可以节省内存。 静态成员的定义或声明要…...

Qt之滑动条和进度条(QSlider、QProgressBar)

文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中&#xff0c;滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中&#xff0c;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程序

本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个…...

itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似&#xff0c;GPIO 在设备树中也存在两层定义&#xff0c;首先是 GPIO 控制器&#xff0c;这部分由芯片原厂工程师编写&#xff0c;相当于 GPIO 底层…...

函数(定义、返回值、调用、参数)

目录 ❤ 无参函数 ❤ 有参函数 ❤ 空函数 ❤ 什么是返回值&#xff1f; ❤ 为什么要有返回值&#xff1f; ❤ 什么是函数调用&#xff1f; ❤ 为何用调用函数&#xff1f; ❤ 函数调用的三种形式 ❤ 形参和实参 形参 实参 ❤ 位置参数 位置形参 位置实…...

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 住院医生站、住院护士站功能实现

住院医生站主模块&#xff1a;包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 &#xff08;1&#xff09;医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作&#xff1b; ②医嘱类型含药品、项目、材料、嘱托&#xff1b; ③支持住院各…...

高性能定时器介绍及代码逐行解析--时间堆

简介 在《Linux高性能服务器编程》中&#xff0c;介绍了三种定时方法&#xff1a; socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 基础知识 非活跃&#xff0c;是指客户端&#xff08;这里是浏览器&#xff09;与服务器端建立连接后&#xff0c…...

汇编语言学习笔记五

div指令 除法&#xff0c; 被除数&#xff1a;默认是放在ax或者dx中&#xff0c;其位数为16位&#xff0c;则在ax中&#xff0c;如位数为32位&#xff0c;则高位在dx中&#xff0c;低位在ax中 除数&#xff1a;放在寄存器或者内存单元中&#xff0c;有8位和16位两种。 结果&am…...

Linux下的epf 是什么?

EPF (Extended Page Frame) 是 Linux 内核中的一个功能&#xff0c;它用于管理大内存系统中的物理页框。具体来说&#xff0c;当系统中的物理内存超过 1TB 时&#xff0c;传统的页表结构会变得非常庞大和复杂&#xff0c;给内存管理带来很大的困难。 EPF 架构通过将物理地址分…...

如何在广告形式选择上化解用户厌恶和变现瓶颈?

​用户讨厌广告&#xff0c;这似乎是一个共识。在日复一日的使用中&#xff0c;用户会遇到各种各样的广告形式&#xff0c;从搜索结果中的广告链接&#xff0c;到视频中不间断的广告&#xff0c;再到流行应用中的推广内容。 无处不在的广告已经让用户不胜其烦&#xff0c;这也…...

【Android入门到项目实战-- 9.2】—— 传感器实战使用教程(靠近黑屏和计步器)

上篇文章介绍了传感器的基础用法&#xff08;如有需要&#xff0c;可先移步&#xff09;&#xff0c;下面将通过两个实战案例学习具体如何使用。 一、靠近黑屏 这是距离传感器的简单应用。 –检测手机是否贴在耳朵上正在打电话&#xff0c;以便自动熄灭屏幕达到省电的目的。也…...

软件项目生命周期模型

目录 瀑布模型 快速原型模型 敏捷模型 迭代模型&#xff08;增量模型&#xff09; 螺旋模型 瀑布模型 定义&#xff1a;早就计划好了&#xff0c;按计划顺序&#xff08;计划、设计、开发、测试、维护&#xff09;线性执行 适用于&#xff1a;需求明确、变化少的项目 缺…...

linux系统TP-ti,tsc2046外设调试

一、整体调试思路 tp外设属于比较常见且比较简单的外设&#xff0c;今天以ti,tsc2046这款为例简述下tp外设的调试。 整体思路 1、配置设备树----驱动调试的device部分 2、tp驱动编译及匹配—driver部分 3、驱动整体调试 二、配置设备树 对于ti,tsc2046我们可以参考内核Docum…...

ChatGPT指令大全

1. 写报告&#xff1a;我现在正在 [报告的情境与目的]。我的简报主题是 [主题]&#xff0c;请提供 [数字] 种开头方式&#xff0c;要简单到 [目标族群] 能听懂&#xff0c;同时要足够能吸引人&#xff0c;让他们愿意专心听下去。 2. 研究报告&#xff1a;写出一篇有关 [知识] …...

【Vue面试题】Vue2.x生命周期?

文章目录 1.有哪些生命周期&#xff08;系统自带&#xff09;?beforeCreate( 创建前 )created ( 创建后&#xff09;beforeMount (挂载前)mount (挂载后)beforeUpdate (更新前)updated (更新后)beforeDestroy&#xff08;销毁前&#xff09;destroy&#xff08;销毁后&#xf…...

运算放大器 - 笔记 02 -恒流源

恒流源 / 电流源 一、方案一二、方案二三、方案三四、方案四 前言&#xff1a;最近在学习运放&#xff0c;三极管&#xff0c;二极管&#xff0c;场效应管等器件的组合电路。捡起了以前的模电知识&#xff0c;写下笔记&#xff0c;以防再度忘记。 本文使用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模块 做题记录

评分标准文件及环境 评分标准&#xff1a;ZZ-2022029 网络安全赛项正式赛卷.zip 自己做的Linux靶机&#xff1a; 自己做的Windows靶机&#xff1a; 文章目录 评分标准文件及环境A-1 任务一 登录安全加固1. 密码策略&#xff08;Windows&#xff0c;Linux&#xff09;a. 最小密…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...