【c++】static和const修饰类的成员变量或成员函数

news2025/2/11 9:23:52

目录

1、静态成员变量

2、静态成员函数

3、常函数

4、常对象


当我们使用c++的关键字static修饰类中的成员变量和成员函数的时候,此时的成员变量和成员函数被称为静态成员。

静态成员包含:

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

1、静态成员变量

静态成员变量有着如下几个特点:

  1. 所有对象共享一份数据
  2. 在编译阶段分配内存
  3. 类内声明,类外初始化

需要我们牢记的是,空类的内存空间大小为1,是为了每个空类对象一个独一无二的地址。

当我们在类内声明静态成员变量之后,需要在类外定义静态成员变量:

int Data::m_varA = 10;
int Data::m_varB = 10;

定义多个类对象,打印出不同类对象的同一个静态成员变量,可以很明显看出结论:类对象共享静态成员变量的同一份数据

 对于私有权限下的静态成员变量m_varB,发现在类的外部是无法访问的:

 这说明了:静态成员变量也是有访问权限的。

由于静态成员变量是在编译期间分配的,那么可以不可以通过类名直接访问静态成员变量呢?

实践出真知,运行效果图如下: 

 那么我们就需要记得:静态成员变量有两种访问方式,第一种是通过对象,第二种是通过类名

2、静态成员函数

静态成员函数有着如下的特点:

  • 程序共享一个函数
  • 静态成员函数只能访问静态成员变量

对于第一个特点程序共享一个函数怎么理解,通过案例代码来进行深刻理解:

class Data
{
public:

	static void func()
	{
		cout << "static void func()函数调用" << endl;
	}
private:

};

int main(void)
{
	Data d1;
	Data d2;

	d1.func();
	cout << "d1 -> func()函数的地址为 : " << &d1.func << endl;
	d2.func();
	cout << "d2 -> func()函数的地址为 : " << &d2.func << endl;

	return 0;
}

静态成员变量有着访问权限的限制问题,那对应的静态成员函数也有着同样的访问权限问题:

当我们使用静态成员函数的时候,静态成员函数只能访问静态成员变量,其余变量是无法访问的,从而得出以下结论:静态成员函数只能访问静态成员变量

静态成员函数和静态成员变量一样,也有着两种访问方式通过对象和类名访问

3、常函数

成员函数加const后我们可以称这个函数为常函数,常函数有着如下特点:

  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改
class Data 
{
public:
	Data() 
	{
		m_A = 0;
		m_B = 0;
	}

	void change() const
	{
		this->m_A = 100;
	}
	int m_A;
	mutable int m_B; //可修改 可变的
};

此上述案例代码看起来却似乎没有问题,但是当我们运行的时候会出现报错,因为在常函数里面是不被允许修改成员变量的。如果想要在常函数中修改成员变量,需要在变量前加mutable这个关键字,有了mutable关键字之后,该成员变量就可以在常函数中修改了。

4、常对象

声明对象前加const称该对象为常对象,常对象有着如下特点:

  • 常对象只能调用常函数
class Data 
{
public:
	Data() 
	{
		m_A = 0;
		m_B = 0;
		//cout << "int m_A = " << m_A << endl;
		//cout << "mutable int m_B = " << m_B << endl;
	}
	void func()
	{
		cout << "func()函数调用" << endl;
	}

	void change() const
	{
		//this->m_A = 100;
		this->m_B = 100;
	}
	int m_A;
	mutable int m_B; //可修改 可变的
};

int main(void)
{
	//Data d1;
	//d1.change();
	//cout << "d1 -> int m_A = " << d1.m_A << endl;
	//cout << "d1 -> mutable int m_B = " << d1.m_B << endl;

	const Data d1;
	//常对象不能修改成员变量的值,但是可以访问
	//d1.m_A = 100;
	cout << "const Data d1 -> int m_A = " << d1.m_A << endl;
	cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;

	//常对象只能使用常函数
	//d1.func();
	d1.change();
	cout << "const Data d1 -> int m_A = " << d1.m_A << endl;
	cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;

	return 0;
}

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

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

相关文章

window系统:python3 + auto-py-to-exe 打包playwright为exe,内含独立浏览器

auto-py-to-exe的使用参考一下链接&#xff1a; 链接: python—auto-py-to-exe—.py文件打包成.exe文件最全最详细&#xff08;用不同的类别做教程&#xff09; 1、使用auto-py-to-exe打包playwright成exe&#xff0c;运行之后运行一直报错&#xff1a;FileNotFoundError: [Wi…

Java-API简析_java.lang.Character类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131178778 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

OJ: Digit Primes

目录 1.题目 2.中文翻译 3.代码 4.代码中部分程序段思路详解 4.1 素数判定高效率代码&#xff1a; ​编辑 4.2 最小的素数是 2 4.3 python中如何计算一个数各个位的和 1.题目 题目描述&#xff1a; A prime number is a positive number, which is divisible by exactly…

chatgpt赋能python:在Python中建立虚拟环境

在Python中建立虚拟环境 在Python编程中&#xff0c;建立虚拟环境是一项非常重要的工作。虚拟环境不仅可以避免不同版本的库之间的冲突&#xff0c;还可以使我们更好地控制项目的依赖关系。在本文中&#xff0c;我们将介绍如何使用Python建立虚拟环境。 第一步&#xff1a;安…

Jmeter参数化方式

前言&#xff1a;什么是参数化&#xff1f; 把测试数据组织起来&#xff0c;用不同的测试数据调用相同的测试方法&#xff08;实现测试数据跟测试脚本分离&#xff09;。 一、用户定义的变量&#xff1a; 1、作用&#xff1a;定义全局变量 2、局限性&#xff1a;每次取值都是…

chatgpt赋能python:Python建模型指南

Python建模型指南 Python是一种功能强大的编程语言&#xff0c;以其优雅的语法和丰富的库而闻名。而且&#xff0c;Python也是机器学习、人工智能和数据科学领域的首选语言之一。在本文中&#xff0c;我们将学习Python中如何建模型。 什么是建模&#xff1f; 建模是指使用统…

【MySQL数据库 | 第十七篇】索引以及索引结构介绍

目录 前言&#xff1a; 索引简介&#xff1a; 索引结构&#xff1a; 二叉树索引结构 Tree&#xff08;普通二叉树&#xff09; B-Tree(多路平衡查找树) BTree 哈希索引数据结构 总结&#xff1a; 前言&#xff1a; 在实际生活中&#xff0c;我们对SQL语句进行优化实际上有…

Linux,看这篇就够了

Linux 一、为什么要学linux二、目录介绍三、vi / vim编辑器四、网络配置4.1、修改 IP 地址4.2、配置主机名4.2.1、修改主机名称4.2.2、修改 hosts 映射文件 五、系统配置5.1、service 服务管理5.2、systemctl5.3、防火墙5.4、关机重启命令5.5、查看系统内核与版本 六、常用命令…

一分钟学一个 Linux 命令 - cat 和 tail

前言 大家好&#xff0c;我是 god23bin。今天我给大家带来的是 Linux 命令系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天&#xff0c;需要你花费两分钟时间&#xff0c;因为我们要介绍的是两个常用的查看文件内容的命令&#xff1a;cat 和 ta…

动态规划-背包问题(三)

动态规划-背包问题&#xff08;三&#xff09; 1 描述2 样例2.1 样例 1:2.2 样例 2: 3 算法解题思路以及实现方法3.1 算法解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件以及边界情况3.1.4 计算顺序 3.2 算法实现3.2.1 java实现的O(MN)算法复杂度3.2.2 C实现的O(MN)算法复…

Lua基本语法

目录 1 lua基础数据结构 2 Lua 变量 3 Lua 循环 3.1 Lua while 循环 3.2 Lua for 循环 数值for循环 泛型for循环 3.3 Lua repeat...until 循环 3.4 Lua 循环嵌套 3.5 循环控制语句 Lua break 语句 Lua goto 语句 4 Lua 流程控制 4.1 Lua if 语句 4.2 Lua if...else 语…

04-编织灵魂旋律:Golang 函数的魔力绽放

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

常见网络设备及其功能

1.常见网络设备及其功能 笔记来源&#xff1a; Computer network components and their functions 设备工作所在层隔离冲突域隔离广播域路由器(Router)网络层√√网桥(Bridge)数据链路层√交换机(Switch)数据链路层√中继器(Repeater)物理层集线器(Hub)物理层 1.1 路由器&…

chatgpt赋能python:Python并排输出数字——快速高效的实现技巧

Python并排输出数字——快速高效的实现技巧 在Python编程中&#xff0c;我们经常需要对数字进行输出&#xff0c;并排输出数字是一种非常常见的需求。比如说&#xff0c;我们需要将多个数据进行比较&#xff0c;或者需要将多个相关数据进行显示&#xff0c;等等。本文将介绍Py…

一.基于压缩感知(CS)的DOA估计方法-OMP-CS算法

阅读须知&#xff1a; 1.本文为本人原创作品仅供学习参考&#xff0c;未经过本人同意禁止转载和抄袭。 2.要想无障碍阅读本文需要一定的压缩感知理论以及压缩感知信号重构算法基础。 3.话不多说&#xff0c;直接开搞。 1 基于压缩感知DOA估计方法原理 假设有K个远场窄带信号…

dpdk21.11 编译(meson+ninja)及VFIO模块的加载和运行

目录 前言 安装前的环境配置 编译流程 1. 设置环境变量&#xff08;好像也不需要了&#xff09; 2. 构建dpdk 3. 编译 执行测试 1. 绑定vfio-pci 模块 2. 挂载网卡 3. 设置大页 4. 启动测试程序-testpmd 前言 操作系统&#xff1a;ubuntu22.04.2 LTS 内核版本&#…

深入理解 Java ServiceLoader、Dubbo ExtensionLoader 源码结合实战篇

介绍Java SPIDriver 实现类DriverManager 驱动管理器类loadInitialDrivers 方法registerDriver 方法getConnection 方法 ServiceLoader 核心类LazyIterator#hasNextService 方法LazyIterator#nextService 方法 Dubbo SPI加载策略FilterExtensionLoaderExtensionLoader#getExten…

框架篇面试详解

spring AOP AOP称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装成为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&#xff09;&#xff0c;减少系统中的重复代码&am…

02-舞动数据类型:Golang 类型定义的奇妙之旅

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

chatgpt赋能python:Python如何建设网页并实现客户端与服务器端的通信

Python如何建设网页并实现客户端与服务器端的通信 介绍 Python是一种流行的编程语言&#xff0c;被广泛应用于Web开发。在Web开发中&#xff0c;Python可以用来建立并联接网页与服务器端的通信。 这篇文章将介绍如何使用Python建立网页&#xff0c;并展示如何实现客户端与服…