[C++从入门到精通] 9.inline、const、mutable、this和static

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 特殊的成员函数inline
      • 二. 成员函数末尾的const
      • 三. mutable
      • 四. 返回自身对象的引用_this
      • 五. static成员


一. 特殊的成员函数inline

假设我们不在头文件中声明、源文件中定义函数了,而是全部放在头文件中来实现:

class Time
{
public:explicit Time(int tmphour);  int Hour;public:void addHour(int tempHour){Hour += tempHour;}	
};

这种直接在类的定义中实现的函数,会被系统当做内联函数inline来处理,其他相关的知识点可以参考我们之前的讲解。


二. 成员函数末尾的const

成员函数后面增加一个const的限定词后也被称为常量成员函数,其特性与用法如下:

特性:

1.不但要在成员函数的声明后增加const,也要在成员函数的定义中增加const
2.非成员函数不允许使用const修饰符
3.const成员函数既能被const类型对象调用也能被非const类型对象调用

作用:

const成员函数被限定:不能在函数中修改关于类的任何状态,包括其各种成员变量的值

举例:

//.h
class Time
{
public:explicit Time(int tmphour);  explicit Time();  int Hour;public:void addHour(int tempHour) const;};
//.cpp
void addHour(int tempHour) const
{Hour = tempHour;  //报错:表达式必须是可修改的左值(因为const定义的成员函数,其内的成员变量值不能被修改)
}

此外,const成员函数也是个万人迷,既能被const类型对象调用也能被非const类型对象调用;非const成员函数只能被非const类型对象调用。

public:void addHour(int tempHour) const;void addMinute(int tempMinute);

在这里插入图片描述


三. mutable

问题:

如何修改const修饰的常量成员函数中的成员变量?

前面我们说过常量成员函数中的成员变量不可以进行修改,这里有人会想了,那我直接取消常量成员函数后面的const修饰,将其变成普通成员函数,是不是就可以正常修改其内的成员变量了。没错,这样是可以修改了,但是我们不要忘了:

  • const成员函数既能被const类型对象调用也能被非const类型对象调用
  • const成员函数(普通成员函数)只能被非const类型对象调用

这就导致一个问题,就是如果之前代码中是使用const类型对象调用的常量成员函数,这时将常量成员函数变成普通成员函数后,我们也必须将调用其的const类型对象改为非const类型对象后才能正常调用修改后的普通成员函数。将原本const修饰的类对象取消掉,这违背了程序设计的初衷——不想让这个类对象修改成员变量的值。

定义:

为了解决上述的问题,我们引入了mutable的概念来突破const的限制,mutable(不稳定,容易改变的意思),const的反义词。

mutable修饰的成员变量,表示这个成员变量永远处于可以被修改的状态,即便是在const结尾的常量成员函数中。

举例:

class Time
{
public:mutable int Hour;public:void addHour(int tempHour) const;
};
void Time::addHour(int tempHour) const
{Hour = tempHour;  //因为Hour是被mutable修饰的,这里即使是在常量成员函数addHour中,仍然可以被修改。
}

四. 返回自身对象的引用_this

class Time
{
public:int Hour = 50;
public:Time &addHour(int tempHour);
};
Time &Time::addHour(int tempHour)
{Hour += tempHour;return *this;  //把对象自己给返回去了
}int main()
{Time myTime;myTime.addHour(2);
}

Time对象myTime的地址:0x001df720

在这里插入图片描述
返回的this指针地址仍为:0x001df720

在这里插入图片描述

结论: 说明this是一个指向自身类对象(myTime)的指针。

  • return *this返回的是当前对象的克隆或者本身(若返回类型为Time,则是克隆;若返回类型为Time&,则是本身。本文举例是后者)。
  • return this 返回当前对象的地址(指向当前对象的指针)

如何理解这个this?

当我们在程序中调用成员函数/成员变量时,编译器负责把这个对象的地址(&myTime)传递给成员函数中一个隐藏的this形参

即:

//我们写的:T
ime &Time::addHour(int tempHour){}//实际上的
Time &Time::addHour(Time *this, int tempHour){}
Time myTime;//我们写的:
myTime.addHour(2);  //实际上的
myTime.addHour(&myTime, 2);  //调用时,编译器会把myTime的地址传递给成员函数隐藏的`this`形参

这也解释了一个问题:为什么在成员函数中,不需要调用就可以直接使用成员变量?

Time &Time::addHour(int tempHour)
{//程序员角度:Hour += tempHour;  //成员变量Hour	//系统的角度:this->Hour += tempHour;  
}

因为在系统角度看来,任何对类成员(Hour)的直接访问,都被系统看做是通过this做隐式调用的(this->Hour)。

this的相关特性:

  • this指针只能在成员函数中使用,静态函数或全局函数等是不存在this指针的。
  • 在普通成员函数中,this是一个指向非const对象的const指针。
    假设类是Time,那么this的实际定义是Time *const this,即this指针只能指向当前类对象,不能在指向其他类的对象(const后置)。
  • const成员函数中(void Time::addHour(int tempHour) const;), this是一个指向const对象的const指针。
    假设类是Time,那么this的实际定义是const Time *const this,不但this不能在指向其他类对象,而且this指向的自身类对象的成员变量值也不能更改。

五. static成员

参考我的另一篇文章:[C++] static静态成员变量/函数的用法


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

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

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

相关文章

Day 75:通用BP神经网络 (2. 单层实现)

代码: package dl;import java.util.Arrays; import java.util.Random;/*** Ann layer.*/ public class AnnLayer {/*** The number of input.*/int numInput;/*** The number of output.*/int numOutput;/*** The learning rate.*/double learningRate;/*** The m…

极海APM32F003F6P6烧写问题解决记录

工作中遇到的,折腾了好久,因为电脑重装过一遍系统,软件也都重新安装了,所以不知道之前的配置是什么,旧项目代码编译没问题,烧写时疯狂报错,用的是JLink。 keil版本v5.14 win10版本 JLink版本…

class version 61 java version 17.0.4

class version (javap -verbose xxxx.class)_spencer_tseng的博客-CSDN博客

基于EEGLAB的ICA分析

目录 1.ICA原理 2.ICA的实现 3.ICA成分识别 4.ICLabel识别并去除伪迹 5.ICA成分识别练习 1.ICA原理 得到的每一个地形图,实际上就是它的权重谱。 投射:根据原成分恢复原始信号。 选择性投射:去伪。 2.ICA的实现 extended,1&…

聊聊企业数据安全那些事~

保护企业数据安全的重要性与方法 随着信息技术的快速发展,企业数据的安全性变得越来越重要。在数字化时代,企业的核心业务和关键信息都存储在电脑系统中,一旦遭受到数据泄露、黑客攻击或恶意软件感染,将可能对企业造成严重的损害…

24考研数据结构-图的基本操作

目录 6.6. 图的基本操作1. Adjacent(G,x,y)边的存在2. Neighbors(G,x):列出图G中与结点x邻接的边3. InsertVertex(G,x):在图G中插入顶点x4. DeleteVertex(G,x):从图G中删除顶点x5. AddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在&#xff0c;则向图G中添加该边。6. Fi…

智能视觉新时代:探索Intewell-Hyper II在机器视觉芯片检测中的独特魅力

随着科技的不断进步&#xff0c;芯片制造业正在经历前所未有的快速发展。为了确保芯片的品质和可靠性&#xff0c;机械视觉芯片检测技术逐渐成为行业内的重要环节。作为机器视觉领域的重要部分&#xff0c;Intewell操作系统在打造高效、精确的检测方案方面发挥着关键作用。 基…

GraphGT: Machine Learning Datasets for Graph Generation and Transformation

一、文章来源 > Du Y, Wang S, Guo X, et al. Graphgt: Machine learning datasets for graph generation and transformation[C]//Thirty-fifth Conference on Neural Information Processing Systems Datasets and Benchmarks Track (Round 2). 2021.二、概述 1、文章提出…

uniapp 持续获取定位(登录状态下才获取)(不采用定时器)(任意页面都可监听定位改变)

基于上次文章做了优化和改良,保证在登录状态下才获取定位信息 uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)_uniapp小程序定位_前端小胡兔的博客-CSDN博客本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定…

go-zero超强工具goctl的常用命令api,rpc,model及其构建的服务解析

goctl api 详情移步&#xff1a; go-zero的路由机制解析 基于go-zero的api服务刨析并对比与gin的区别 goctl rpc goctl支持多种rpc&#xff0c;较为流行的是google开源的grpc&#xff0c;这里主要介绍goctl rpc protoc的代码生成与使用。 protoc是grpc的命令&#xff0c;作用…

ELK日志分析系统概述及部署

ELK 平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kibana 三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一、ELK概述 1、组件说明 ①ElasticSearch ElasticSearch是基于Lucene&#xff08;一个全文…

Spring Cloud Gateway

一 什么是Spring Cloud Gateway 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 Zuul 来说&#xff0c;Spring Clo…

vue项目实战-脑图编辑管理系统kitymind百度脑图

前言 项目为前端vue项目&#xff0c;把kitymind百度脑图整合到前端vue项目中&#xff0c;显示了脑图的绘制&#xff0c;编辑&#xff0c;到处为json&#xff0c;png&#xff0c;text等格式的功能 文章末尾有相关的代码链接&#xff0c;代码只包含前端项目&#xff0c;在原始的…

一百四十六、Xmanager——Xmanager5连接Xshell7并控制服务器桌面

一、目的 由于kettle安装在Linux上&#xff0c;Xshell启动后需要Xmanager。而Xmanager7版本受限、没有免费版&#xff0c;所以就用Xmanager5去连接Xshell7 二、Xmanager5安装包来源 &#xff08;一&#xff09;注册码 注册码&#xff1a;101210-450789-147200 &#xff08…

车载软件架构 —— 闲聊几句AUTOSAR OS(十)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意&#xff1a; 思路&#xff1a; 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问&#xff0c;都去字典树上dfs 注意到字符集只有3&#xff0c;因此如果发现有不同的字符&#xff0c;去枚举新的字符 Code&#xff1a; #in…

Excel功能总结

1&#xff09;每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如&#xff1a;固定第1~2行&#xff0c;设置成“$1:$2” 2&#xff09;将页面内容打印在一页【缩印】 1.选好需要打印的区域&#xff0c;“页面布…

AOSP开发——APN配置文件路径

Android1~9&#xff0c;APN配置文件路径&#xff1a; vendor/sprd/telephony-res/apn/apns-conf_8.xml Android10~12&#xff0c;APN配置文件路径&#xff1a; /vendor/sprd/telephony-res/apn/apns-conf_8_v2.xml Android13&#xff0c;APN配置文件路径&#xff1a; /vendor/…

Android安卓实战项目(8)---自行车fitting计算软件(源码在文末)

Android安卓实战项目&#xff08;8&#xff09;—自行车fitting计算软件&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 【bilibili演示地址】 https://www.bilibili.com/video/BV1eu4y1B7yA/?share_sourcecopy_web&vd_sourceb2e9b9ed746ac…

0101docker mysql8镜像主从复制-运维-mysql

1 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 Mysql支持一台主库同时向多台从库进行复制&#xff0c;从库同时可以…