const成员和static成员详解

news2025/1/14 0:52:13

const成员和static成员详解

  • 1.const成员函数
  • 2.static成员
    • (1)静态成员变量
    • (2)静态成员函数
    • (3)静态成员使用场景

1.const成员函数

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对调用对象的任何成员进行修改。

**格式:**将const关键字放在函数的括号后面
在这里插入图片描述

以这种方式声明和定义的类函数被称为const成员函数,就像尽可能地将函数形参中的引用和指针声明为const一样,只要成员函数不修改调用对象,就应该将其声明为const,这样既可以避免调用对象被修改,而且普通对象和const对象都可以调用。

前面提到过,读写权限只能缩小,不能放大,同理,const对象不可以调用非const成员函数,一是因为这是权限的放大,二是因为非const成员函数无法确保调用对象不被修改。非const对象可以调用const成员函数,因为这是权限的缩小。

2.static成员

概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。静态成员为所有类对象共享,类的对象都可以访问静态成员,所有类的成员访问的静态成员都是同一份静态成员。

(1)静态成员变量

特性

  1. 静态成员变量为所有类对象所共享,不属于某个具体类的对象,它是属于类的,只有一份内存,存放在静态区。比如说太阳,这里的太阳就可以指静态成员变量,所有人都能照射到,所有对象都可以访问到,且访问的就是同一个太阳。

  2. 在对象的构造函数中不能对静态变量进行初始化,因为静态变量不属于单个对象,不需要对象去初始化。静态成员变量在类中加static声明,静态成员变量必须在类外进行初始化定义,定义时不添加static关键字,即静态成员类中声明,类外进行初始化定义

  3. 类静态成员即可用类名::静态成员 或者 对象.静态成员 来访问,类名访问,肯定是从类外访问,那么类外访问的话,就要求静态数据成员是公有属性,可以用类名访问这一点也说明:静态数据成员肯定不是属于对象的,如果是属于对象,那么又怎么能用类名去访问呢?

  4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

  5. 静态成员变量只能初始化,不能赋值

如图,如果在类中进行初始化定义,编译器就会报错

在这里插入图片描述

改成如下,类中声明,类外定义就没有问题了

在这里插入图片描述

如果给静态成员变量赋值,编译器就会报错

在这里插入图片描述

(2)静态成员函数

定义方式:

  • 类中声明,类外定义
  • 类中定义
class ClassName
{
public:
    static Type fun(){}//在类中定义
    static Type fun2();//类中声明
};
Type ClassName::fun2(){}//在类外定义

在类外定义的时候不需要再加上static 如:static void ClassName::test_fun1(){},这样写是不对的,正确的类外定义应该是void ClassName::test_fun1(){}。

静态成员函数没有隐藏的this指针,不能访问任何非静态成员,因为可以通过类名直接去访问函数,那么过程中间不存在对象,this指针就没有对象去指向了,为了避免这种情况的发生,索性就静态函数中就不要this指针了,如果通过对象去调用,虽然可以正确调到,但是this指针也没了。

静态成员函数不可以访问普通成员变量,也不可以调用普通成员函数,由于静态成员函数和普通成员变量的生命周期不同,静态成员函数的生命周期是全局的,随着程序的结束而结束,普通成员变量是局部的,当对象消亡了,普通成员变量也就消亡了,如果静态成员函数访问普通成员变量,而普通成员变量消亡,就会造成非法访问的一个问题,所以静态成员函数不可以访问普通成员变量,但是普通函数可以调用,那么怎样避免静态成员函数调用的普通函数中调用了普通成员变量的情况呢?索性就一刀切,既不要访问普通成员变量也不访问普通成员函数。

普通成员函数可以访问静态成员变量,可以调用静态成员函数,静态成员函数只能访问静态成员变量,调用静态成员函数,不能访问任何非静态的东西。

(3)静态成员使用场景

因为静态成员是属于类而不是属于单个对象的,所以静态成员用来记录类相关的信息,比如,用静态成员来统计创建了多少个类的对象。

#include <iostream>

using namespace std;

class Person
{
private:

public:
	int age;			// 普通成员变量
	static int cnt;		//统计程序存在的中类的对象个数
	
	Person(void);	//构造函数
	~Person(void);	//析构函数
};

//在构造函数中cnt加一
Person::Person(void)
{
	age = 18;
	Person::cnt++;	//方式1
	//cnt++;		//方式2
	//this->cnt++;	//方式3
}

//在析构函数中cnt减一
Person::~Person(void)
{
	Person::cnt--;
}

// 对Person类中的静态成员定义		
int Person::cnt;	

int main(void)
{
	cout << "Person::cnt = " << Person::cnt << endl;
	
	Person *p1 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	Person *p2 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	Person *p3 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	
	delete(p1);
	cout << "Person::cnt = " << Person::cnt << endl;

	delete(p2);
	cout << "Person::cnt = " << Person::cnt << endl;

	delete(p3);
	cout << "Person::cnt = " << Person::cnt << endl;
	
	return 0;
}

运行结果如下:

在这里插入图片描述

(1)每次创建Person类的对象都会调用对象自己的构造函数,从上面的程序执行结果可以得出结果,每个对象的构造函数操作的cnt都是同一份cnt;
(2)析构函数也是如此;

总结:对象操作的类静态成员都是同一份;

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

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

相关文章

热点新品—类器官代谢组学

01为什么研究类器官如此重要&#xff1f; 类器官技术是近年来生物医学领域最具突破性的前沿技术之一&#xff0c;更是科技部发布了“十四五”国家重点研发计划的6个重点专项之一。因模型本身具有极高的创新性&#xff0c;深受基金申请和高分杂志的青睐。并且由于人源化类器官可…

让你室友、工友、小孩、断网的骚操作!ARP攻击演示!

前提&#xff1a; ① 、你需要 和 你室友处于同一个局域网&#xff0c;互相能ping通 ②、你需要知道你室友的IP ③、您可能需要一个linux 设备&#xff0c;手机也行&#xff08;需要安装termux 来执行命令&#xff09;、linux系统电脑、树莓派等都可以。 -----------------…

PCB入门学习—原理图的绘制2

目录 2.2 TEA5767音频模块的绘制 2.3 ENC28J60以太网模块的绘制 学习目录&#xff1a; 2.2 TEA5767音频模块的绘制 首先有个问题&#xff1a;为什么这个电容放在原理图上怎么移动也对不齐&#xff1f;&#xff1f; 解决方法&#xff1a;把原理图上的栅格这个东西设置成1mil…

【小甲鱼C语言】课后笔记第一章第七节——算数运算符

目录 1. 算术运算符 2. 何谓“目”&#xff1f; 3. 表达式 4. 类型转换 5.课后习题&#xff08;编程题&#xff09; 1. 算术运算符 C 语言通过提供大量的运算符来支持我们对数据进行处理&#xff0c;前边我们将一个值存放到变量中&#xff0c;使用的是赋值运算符&#xff…

lerna+rollup搭建vue组件库并发布到npm

一、框架介绍 1. lerna Lerna 是一个管理工具&#xff0c;用于管理包含多个软件包&#xff08;package&#xff09;的 JavaScript 项目。 目的是将大型代码仓库分割成多个独立版本化的软件包。 官网点这里 2. rollup Rollup 是一个 JavaScript 模块打包工具&#xff0c;可以将…

骨灰级精品,京东百万架构师亲码的MySQL内部笔记太硬核了

前言 MySQL是Java程序员面向高级的必备技能&#xff0c;很多朋友在面试时经常在这里折戟沉沙&#xff0c;饮恨不已。熟练掌握MySQL知识&#xff0c;在实践中具有很强的操作性&#xff0c;尤其是在互联网行业&#xff0c;不仅要写好代码、实现功能&#xff0c;而且还要在高并发…

P1983 [NOIP2013 普及组] 车站分级——拓扑排序+dp

[NOIP2013 普及组] 车站分级 题目描述 一条单向的铁路线上&#xff0c;依次有编号为 $1, 2, …, n $的 $n $个火车站。每个火车站都有一个级别&#xff0c;最低为 111 级。现有若干趟车次在这条线路上行驶&#xff0c;每一趟都满足如下要求&#xff1a;如果这趟车次停靠了火车…

二进制转化成十进制进行输出

给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2A 3 , B 2A3,B2 的时候&#xff0c;AAA 的二进制表示是 : 111111 , BBB 的二进制表示是 101010 &#xff0c;你需要输出答案为 : 212121 输入描述: 一行两…

educoder:实验13 算法-穷举法和二分法

第1关&#xff1a;百钱百鸡 任务描述 我国古代数学家张丘建在《算经》一书中提出的数学问题&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 相关知识 为了完成本关任务&#xff…

和ChatGPT大战多个回合,我知道了这些真相

最近&#xff0c;ChatGPT在国内外社交平台上可谓是火出圈了。作为一款人工智能语言模型&#xff0c;它可以和人类以对话的方式进行互动&#xff0c;比你早已熟知的Siri&#xff0c;小度还有小爱同学要更加智能与专业。因为它除了回答问题外还能进行创作&#xff0c;比如写小作文…

喜报 | Bonree ONE 2.0荣获信通院“2022IT新治理年度明星产品”

近日&#xff0c;由信通院“GOLFIT新治理领导力论坛”评选的2022IT新治理年度明星产品重磅出炉&#xff0c;博睿数据一体化智能可观测平台Bonree ONE 2.0凭借卓越的产品力以及优秀的用户体验&#xff0c;从一众产品中脱颖而出&#xff0c;获得“2022IT新治理年度明星产品”。 …

第06讲:Security在前后端分离项目中的综合应用

一、基本业务开发 1.1、需求分析 由于Security对用户进行鉴权和授权是通过用户名去数据库中取权限&#xff0c;所以我们需要开发一个功能&#xff0c;这个功能就是通过username去数据库里查该用户所具备的所有权限 1.2、完成需求 1.2.1、数据库脚本 请下载文章末尾的源代码…

JavaScript高级 |深入闭包

本文已收录于专栏⭐️ 《JavaScript》⭐️ 学习指南&#xff1a;闭包基本概念内存管理垃圾回收GC算法-标记清除GC算法-标记整理GC算法-分代收集GC算法-增量收集GC算法-闲时收集内存泄露完结散花参考文献闭包 闭包是JavaScript中非常容易让人迷惑的知识点。 《在你不知道的Java…

灯泡与影子(三分)

题目描述: 有一天&#xff0c;小明发现他的影子长度随着他在灯泡和墙壁之间走动时会发生变化&#xff0c;一个突发奇想在他的脑海里闪过&#xff0c;他现在想知道他来回走动&#xff0c;他的影子的最大长度是多少&#xff1f; 输入格式: 第一行包含一个整数T (T < 100),表…

C语言 常用标准库函数代码实现

一、内存 1. memcpy函数 memcpy 函数用于 把资源内存&#xff08;src所指向的内存区域&#xff09; 拷贝到目标内存&#xff08;dest所指向的内存区域&#xff09;&#xff1b;拷贝多少个&#xff1f;有一个size变量控制拷贝的字节数&#xff1b; 函数原型&#xff1a;void …

网络工程毕业设计 SSM汽车租赁系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的汽车租赁…

mitmproxy 抓包神器-2.抓取Android 和 iOS 手机 https 请求

前言 抓取手机请求的前提条件是确保手机和电脑在同一网段上&#xff0c;也就是说使用同一WiFi。 启动服务 mitmweb 命令启动服务&#xff0c;默认监听8080端口 (venv) D:\demo\mitmproxy_xuexi>mitmweb [11:59:49.361] HTTP(S) proxy listening at *:8080. [11:59:49.36…

linux redhat8.0 权限管理

在linux里面&#xff0c;一切皆文件&#xff0c;不同的用户对文件有不同的管理权限&#xff0c;而只有root用户能为其他用户分配权限。 读&#xff08;r&#xff09;写&#xff08;w&#xff09;执行&#xff08;x&#xff09;数字表示421文件&#xff08;默认644&#xff09;…

SpringBoot-OneDay

优势 创建独立的spring程序自动配置spring简化的maven配置内嵌tomcat提供生产就绪型功能&#xff0c;如指标&#xff0c;健康检查和外部配置特性 为基于Spring 的开发提供更快的入门体验 开箱即用&#xff0c;没有代码生成&#xff0c;也无需XML 配置。同时也可以修改默认值来…

【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】

目录1. NiN块介绍2. 构建NiN模型3.NIN模型每层输出形状4. 获取Fashion-MNIST数据和训练NiN模型5. 总结前几篇文章介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的模块充分抽取空间特征&#xff0c;再以由全连接层构成的模块来输出分类结果。其中…