首页 > 编程语言 >C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)

C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)

时间:2024-09-16 23:22:32浏览次数:9  
标签:setValue 函数 SpreadsheetCell value ---- 高性能 参数 C++ 显式

2.4、this指针

       每个正常的成员函数调用都会隐含地传递一个指针给到对象,它就是被可能我的天this的隐藏参数。使用该指针访问数据成员或者调用成员函数,也可以将其传递给其他的成员函数或者函数。有时候它对消除有歧义的名字很有用。例如,可以给SpreadsheetCell类定义一个value的数据成员而不是m_value。这种情况下,setValue()可能就会像下面:


void SpreadsheetCell::setValue(double value)

{

value = value; // Confusing!

}

       这行代码是不是很令人迷惑。你的value到底是指哪个:是作为参数传递的那个还是对象成员的那个?


       有些编译器或者编译器设置,上面令人迷惑的代码行能够正常编译,而不会生成报警或错误,但是不会生成代期待的正确结果。


       为了不让这些名字产生歧义,可以使用this指针:


void SpreadsheetCell::setValue(double value)

{

this->value = value;

}

       然而,如果你使用了我们以前讨论过的命名规范,你就永远不会碰到这种名字冲突的情况。


       也可以使用this指针来调用一个作为参数的对象的成员函数的指向对象的指针。例如,假设你写了一个printCell()的单独的函数(不是成员函数)如下:


void printCell(const SpreadsheetCell& cell)

{

println("{}", cell.getString());

}

       如果你想从setValue()成员函数中调用printCell(),一定要传递*this作为参数给到printCell()一个对于SpreadsheetCell的引用,setValue()在其上操作:


void SpreadsheetCell::setValue(double value)

{

this->value = value;

printCell(*this);

}

       注意:不要写printCell()函数,写一个我们以前解释过的客户化的格式会比较方便。可以使用下面的代码来打印一个叫做myCell的SpreadsheetCell的对象:


std::println("{}", myCell);

       换一种方式,可以重载<<操作符,这个我们以后讨论,可以写成下面这样:


cout << myCell << endl;

3、显式对象参数(c++23标准)

       从c++23开始,不用再依赖于编译器提供隐式的this参数,可以使用显式对象参数,通常是一个引用类型。下面的代码段用显式对象参数实现了前面的SpreadsheetCell的setValue()成员函数


void SpreadsheetCell::setValue(this SpreadsheetCell& self, double value)

{

self.m_value = value;

printCell(self);

}

       setValue()的第一个参数现在就是显式对象参数,通常叫做self,但是你可以使用任何你想使用的名字。self的类型以this关键字开头。该显式对象参数一定要是成员函数的第一个参数。一旦使用了显式对象参数,该函数就不再有隐式定义的this;因此,在setValue()函数体中,必须显式使用self来访问SpreadsheetCell中的任何东东。


       使用显式对象参数调用成员函数与使用隐式this参数并没有什么不同。即使setValue()现在指定了两个参数,self与value,你还是会传递一个单独的参数来调用它,该参数就是你想设置的value:


SpreadsheetCell myCell;

myCell.setValue(6);

       如示例使用显式对象参数并没有什么好处,甚至使代码更难读。然而,在下面这些情况下是非常有用的:


提供更显式的语法来书写引用验证的成员函数,这个我们以后会讨论。

对于成员函数模板,其显式对象参数的类型是一个模板类型的参数。在实现const与non-cost重载成员函数时避免代码重复会非常有用,这个我们以后也会讨论。

书写递归lambda表达式时,这个我们以后再讨论。

标签:setValue,函数,SpreadsheetCell,value,----,高性能,参数,C++,显式
From: https://blog.51cto.com/JiangJinHao/12032543

相关文章

  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)
    2.4、this指针    每个正常的成员函数调用都会隐含地传递一个指针给到对象,它就是被可能我的天this的隐藏参数。使用该指针访问数据成员或者调用成员函数,也可以将其传递给其他的成员函数或者函数。有时候它对消除有歧义的名字很有用。例如,可以给SpreadsheetCell类定义一个va......
  • FPGA与Matlab图像处理之直方图均衡化
    文章目录一、什么是直方图?二、什么是直方图均衡化?三、Matlab实现直方图均衡化的步骤第一步:彩色图像转成灰度图像第二步:提取亮度通道的直方图第三步:累计亮度通道的像素值频率第四步:映射到新的灰度值四、Verilog实现直方图均衡化第一步:Verilog实现彩色图像转灰度图像4.......
  • Transformer-Attention机制
    出现Attention机制的原因:基于循环神经网络(RNN)的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果。1seq2seq框架seq2seq:从一个文本序列得到一个新的文本序列。典型的seq2seq任务包括:机器翻译任务、文本摘要任务。简而言之就是......
  • 通过AI大模型现实小红书笔记克隆以及自动化发布
    文章目录前言一、实现思路二、实现步骤1.引入库2.自动登录3.生成笔记4.发布笔记三、界面演示总结前言对于文案小白来说,通过大模型可以轻松帮我们生成各种风格的文案,比如小红书风格的超萌文案。只需要简单几步操作,就能得到让你惊艳的结果。通过自动化的操作,还可以减......
  • Java基础学习(七)(枚举和注解)
    一、枚举枚举是一组常量的集合。枚举属于一种特殊的类,里面只包含一组有限的特定的对象。有两种实现方式:①自定义类实现枚举  ②使用enum关键字实现枚举1.1自定义类实现枚举不需要提供set方法,因为枚举对象值通常为只读对枚举对象/属性使用final+static共同修饰,实现底......
  • k8s集群备份与迁移
    什么是Velero?Velero是一个用Go语言开发的开源工具,用于Kubernetes集群的备份、恢复、灾难恢复和迁移。Velero备份工作流程当用户发起velerobackupcreate时,会执行如下四个动作:velero客户端调用KubernetesAPI创建自定义资源并存储到etcd;BackupController通过Kuber......
  • 【智能算法应用】粒子群算法求解最小生成树问题
    目录1.最小生成树MST2.算法原理3.算法过程4.结果展示5.参考文献6.代码获取1.最小生成树MST最小生成树(MinimumSpanningTree,MST)是在给定的加权无向图中寻找一个边的子集,使得这些边构成的树包含图中的所有顶点,并且边的总权重尽可能小。如果图......
  • 【智能算法应用】海洋捕食者算法求解TSP问题
    目录1.算法原理2.TSP数学模型3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】海洋捕食者算法(MPA)原理及实现2.TSP数学模型旅行商问题(TSP)是一种著名的组合优化问题,它涉及寻找给定一组城市及其之间的距离或成本,如何规划一条最短的路径,使得旅行商从起点出发,......
  • 【智能算法应用】飞蛾扑火算法求解TSP问题
    目录1.算法原理2.TSP数学模型3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】飞蛾扑火算法(MFO)原理及实现2.TSP数学模型旅行商问题(TSP)是一种著名的组合优化问题,它涉及寻找给定一组城市及其之间的距离或成本,如何规划一条最短的路径,使得旅行商从起点出发,访......
  • 基于ssm的旅游景点线路网站设计与实现
    需要项目源码请联系我,目前有各类成品毕设 javaweb sshssmspringboot等等项目框架,源码丰富。专业团队,咨询就送开题报告,活动限时免费,有需要的朋友可以来留言咨询。一、摘要在网络发展的时代,国家对人们的旅游越来越重视,旅游不仅带动了周边的经济,还给城市做了一张宣传名片......