【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )

news2024/10/6 8:23:02

文章目录

  • 一、静态成员函数简介
    • 1、静态成员函数概念
    • 2、静态成员函数声明
    • 3、静态成员函数访问
    • 4、静态成员函数只能访问静态成员
  • 二、代码示例 - 静态成员函数





一、静态成员函数简介




1、静态成员函数概念


静态成员函数归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;

静态成员函数调用不依赖于对象 : 即使 没有创建 类 的 实例对象 , 也可以 通过 类名:: 调用 类中定义的 静态成员函数 ;


静态成员函数作用 : 静态成员函数 通常用于 执行与类本身相关的操作 , 执行该函数 不涉及到 类实例对象中的信息 , 也不能在 静态成员函数 中访问 普通的 成员变量 和 成员函数 ;


2、静态成员函数声明


静态成员函数声明 : 使用 static 关键字 修饰 成员函数 , 就可以将 普通的成员函数 转为 静态成员函数 ;

如 : 下面的 void fun() 普通成员函数 , 在 函数之前添加 static 关键字 , static void fun() 就变成了 静态成员函数 ;

class Student
{
public:
	static void fun()
	{
		cout << "静态成员函数被调用 : number = " << number << endl;
	}
};

3、静态成员函数访问


静态成员函数访问 :

  • 使用 类名 和 域操作符 访问 :
	// 通过 类名:: 调用 静态成员函数
	Student::fun();
  • 使用 对象 访问 :
	// 通过 对象. 调用 静态成员函数
	s.fun();

4、静态成员函数只能访问静态成员


静态成员函数内容要求 : 静态成员函数 只能访问

  • 静态成员变量
  • 其他静态成员函数

静态成员函数 不能访问 非静态成员变量 或 非静态成员函数 ,

普通的 成员变量 和 成员函数 , 需要 通过 类 的 实例对象 来访问 , 需要 依托于 对象才能存在 ,

而 静态成员函数 可以在 不创建 实例对象的前提下被调用 , 因此 静态成员函数中 不能访问 非静态成员 ;


如果在静态成员函数中 , 访问非静态成员 , 会报如下错误 :

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(22,3): error C2597: 对非静态成员“Student::m_age”的非法引用
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述





二、代码示例 - 静态成员函数



下面的代码 , 是在 之前 的 静态成员变量 示例代码的基础上 进行的 ;

在 Student 类中定义静态成员函数 , 使用 static 关键字修饰函数 ;

注意 : 不要在 静态函数中 访问 非静态成员 , 否则会报错 " 对非静态成员“Student::m_age”的非法引用 " ;

	static void fun()
	{
		// 静态成员函数 中 访问非静态成员会报错
		// error C2597: 对非静态成员“Student::m_age”的非法引用
		//m_age = 10;
		cout << "静态成员函数被调用 : number = " << number << endl;
	}

访问 类的 静态成员函数 时 , 可以使用 类名:: 调用 静态成员函数 ;

	// 通过 类名:: 调用 静态成员函数
	Student::fun();

还可以使用 对象. 调用 静态成员函数 ;

	// 通过 对象. 调用 静态成员函数
	s.fun();

代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

	static void fun()
	{
		// 静态成员函数 中 访问非静态成员会报错
		// error C2597: 对非静态成员“Student::m_age”的非法引用
		//m_age = 10;
		cout << "静态成员函数被调用 : number = " << number << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高

	// 在类内部定义静态成员
	static int number;
};

// 在类外部初始化静态成员变量  
int Student::number = 1;

int main() {


	// I. 静态成员变量


	// 使用 域操作符 访问 类静态成员变量
	// 类名::静态成员变量名
	cout << "Student::number = " << Student::number << endl;

	// 在函数中为 类 静态成员变量 赋值
	Student::number = 2;

	// 创建 Student 类型对象
	Student s(10, 150);

	// 使用 对象 访问 类静态成员变量
	// 对象名称.静态成员变量名
	cout << "s.number = " << s.number << endl;


	// II. 静态成员函数


	// 通过 类名:: 调用 静态成员函数
	Student::fun();

	// 通过 对象. 调用 静态成员函数
	s.fun();

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
}

执行结果 :

Student::number = 1
执行 Student 的构造函数
s.number = 2
静态成员函数被调用 : number = 2
静态成员函数被调用 : number = 2
请按任意键继续. . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文(变方框了)问题解决方案

记一次manjaro-i3系统sogoupinying候选词无法正常显示中文&#xff08;变方框了&#xff09;问题解决方案 前言解决方案 前言 今天早上发现公司电脑显卡驱动好像坏了&#xff0c;各种折腾完了干脆把系统搞黑屏无法开机了&#xff0c;时间有限懒再修了&#xff0c;于是重装了系…

【C++面向对象侯捷下】1.导读

文章目录 来源&#xff1a;我的百度网盘 百科全书 专家书籍 C标准库 C编译器

解锁学习新方式——助您迈向成功之路

近年来&#xff0c;随着吉林开放大学广播电视大学的崛起&#xff0c;越来越多的学子选择这所优秀的学府来实现自己的梦想。而作为一名学者&#xff0c;我有幸见证了电大搜题微信公众号的诞生&#xff0c;为广大学子提供了一个全新的学习支持平台。 电大搜题微信公众号&#xff…

解决老版本Oracle VirtualBox 此应用无法在此设备上运行问题

问题现象 安装华为eNSP模拟器的时候&#xff0c;对应的Oracle VirtualBox-5.2.26安装的时候提示兼容性问题&#xff0c;无法进行安装&#xff0c;具体版本信息如下&#xff1a; 软件对应版本备注Windows 11专业工作站版22H222621eNSP1.3.00.100 V100R003C00 SPC100终结正式版…

Android studio安卓生成APK文件安装包方法

1.点击Build->Generate Signed Bundle/APK 2.选择APK 3.首次生成&#xff0c;没有jks文件&#xff0c;就点击Create new。再次生成&#xff0c;直接点Next 4.选择创建jks文件路径 5.点击Next 6.选择release 7.生成完成的apk安装包路径

PostgreSql 统一修改date字段为timestamp

在《Powdersigner PostgreSql 同步表结构到pg数据库》中&#xff0c;导入表结构到pg数据后&#xff0c;发下时间对不上了。mysql的datetime转换后pg的变成了date了。 再同步到数据后&#xff0c;就变成日期类型了。 因为表中基本都有创建时间和修改时间&#xff0c;两个相对固…

电脑桌面透明便签软件是哪个?

在现代快节奏的工作环境中&#xff0c;许多上班族都希望能够在电脑桌面上方便地记录工作资料、重要事项、工作流程等内容。为了解决这个问题&#xff0c;一款优秀的电脑桌面便签软件是必不可少的。在选择桌面便签软件时&#xff0c;许多用户也希望便签软件能够与电脑桌面壁纸相…

文件操作(1)

1. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久…

CBOW (以txt文本小说为例) pytorch实战

CBOW &#xff08;以txt文本小说为例 pytorch实战 今天博主做了一个不错的实验&#xff0c;我认为&#xff0c;很多小伙伴可能都可以从中学到东西。 我先说一下这个实验&#xff0c;我做了什么&#xff0c;在这个实验中&#xff0c;博主会从零&#xff0c;开始从一个txt文件开…

从零开始的 MyBatis 拦截器之旅:实战经验分享

文章目录 MyBatis拦截器可以做什么&#xff1f;Mybatis核心对象介绍四大核心对象如何实现&#xff1f;接口讲解Interceptor接口intercept方法plugin方法setProperties 完整SQL打印拦截器实战拦截器实现拦截器注册 MyBatis拦截器可以做什么&#xff1f; MyBatis拦截器是MyBatis…

某手新版本sig3参数算法还原

Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…

#循循渐进学51单片机#指针基础与1602液晶的初步认识#not.11

1、把本节课的指针相关内容&#xff0c;反复学习3到5遍&#xff0c;彻底弄懂指针是怎么回事&#xff0c;即使是死记硬背也要记住&#xff0c;等到后边用的时候可以实现顿悟。学会指针&#xff0c;就是突破了C语言的一道壁垒。 2&#xff0c;1602所有的指令功能都应用一遍&#…

内网穿透,轻松实现PostgreSQL数据库公网远程连接!

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;,下…

外汇天眼:CFTC处罚Advantage Futures 39.5万美元

美国商品期货交易委员会&#xff08;CFTC&#xff09;对Advantage Futures处以39.5万美元罚款&#xff0c;原因是其监管不力。 CFTC今天发布了一项命令&#xff0c;同时提起并解决了对Advantage Futures LLC的指控&#xff0c;这是一家注册的期货佣金经纪商&#xff0c;因未能…

Linux命令基础

一、linux目录结构。 Linux没有windows的盘的概念&#xff0c;是一个树形的结构。唯一的根目录为/&#xff0c;所有的文件都在他下面。 描述方式也与windows有所不同 二、命令基础格式。 command [-options] [parameter]&#xff08;[ ]表示可选的&#xff09; command:必…

智思Ai企联系统去授权版本+uniapp前后端(内含教程)

智思AI企联系统是一款企业级AI系统&#xff0c;与普通版AI产品相比具备显著差异。该系统允许企业按需选择和定制二开任意功能&#xff0c;以满足不同企业的个性化需求和场景要求。企业可以根据实际业务需求扩展和改进系统功能模块&#xff0c;使之更好地适应企业独特需求。

ESP8266 WiFi物联网智能插座—电能计量

目录 1、芯片功能 2、性能指标 3、寄存器说明 4、UART通信协议 4.1、写操作帧格式和时序 4.2、读操作帧格式和时序 4.3、读取全电参数数据包 4.4、配置波特率 4.5、UART保护机制 5、功能说明 5.1、电流电压瞬态波形计量 5.2、有功功率 5.3、有功功率防潜动 5.4、电能计量 5.5、…

【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )

文章目录 一、静态成员变量概念1、静态成员变量引入2、静态成员变量声明3、静态成员变量初始化4、静态成员变量访问5、静态成员变量生命周期 二、完整代码示例 一、静态成员变量概念 1、静态成员变量引入 在 C 类中 , 静态成员变量 又称为 静态属性 ; 静态成员归属 : 静态成员…

一百八十二、大数据离线数仓——离线数仓从Kafka采集、最终把结果数据同步到ClickHouse的完整数仓流程(待续)

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、项目背景 项目行业属于交通行业&#xff0c;因此数据具有很…

please choose a certificate and try again.(-5)报错怎么解决

the server you want to connect to requests identification,please choose a certificate and try again.(-5)