常量对象 只能调用 常成员函数

一、遇到问题:

//函数声明

void ReadRanFile(CString szFilePath);

const CFvArray<CString>& GetPanelGrade() const { return m_fvArrayPanelGrade; }

//在另一个文件中调用ReadtRanFile这个函数

const CFsJudConfig& psJudConfig = m_pFsDefJudge->GetJudConfig();

psJudgeConfig.ReadRanFile(szFilePath);   //报错!!

报错内容:cannot convert 'this' pointer from  'const CFsJudConfig'  to  'CFsJudConfig&'

这就是因为:使用常量对象CFsJudConfig  调用了  非常量函数ReadRanFile()!

解决方法:

1.将普通成员函数  改为  常量成员函数

void ReadRanFile(CString szFilePath);=》void ReadRanFile(CString szFilePath) const;

(注意:1.1 此时,常量函数内部。常成员函数不能“更新/修改”类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数!

1.2 这个const函数是只读的,不可修改,而非const成员函数是可读可写的。

2.重载一个GetJudConfig()方法

CFsJudConfig GetJudConfig() { return m_pFsDefJudge; }//const关键字可以用于对重载函数的区分

二、原因分析

参考:常量对象只能调用常成员函数 原因分析_牛客博客

1. 首先我们需要知道const *p(常量指针)类型无法转换到*p类型(普通指针),但*p能够向const *p转换

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include<iostream>

using namespace std;

void const_fun( const int* a)

{

    cout << "const fun" << endl;

}

void fun(int *a)

{

    cout << "fun" << endl;

}

int main()

{

    int *a=nullptr;

    const_fun(a);

    const int *b = nullptr;

    fun(b);  //*b为常量指针  无法转换为普通指针  报错

}

2. 于是我们还可以通过const来进行函数重载,使const p与p调用不同的函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include<iostream>

using namespace std;

void fun( const int* a)

{

    cout << "const fun" << endl;

}

void fun(int *a)

{

    cout << "fun" << endl;

}

int main()

{

    int *a=nullptr;

    fun(a);

    const int *b = nullptr;

    fun(b);

}

输出

fun
const fun

3. 与类对比

我们都知道类中函数都隐式传入了this指针,而常函数的作用就是修饰*this不能被修改

也就是 type fun(class *this) const就相当于type fun(const class *this)
于是类中就能存在type fun()与type fun() const两个函数,也就是重载了fun函数

常量对象传入函数的是const指针,普通对象传入的为普通指针。

而普通指针能向常量指针转换而常量指针无法向普通指针转换。

故普通成员能调用常函数,而常量成员无法调用普通函数。

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

#include<iostream>

using namespace std;

class A{

public:

    void fun() const  //相当于 void fun(const A *this)

    {

        cout << "fun const" << endl;

    }

    void fun()  //相当于 void fun(A *this)

    {

        cout << "fun" << endl;

    }

    void test()

    {

    }

    void  test2() const

    {

    }

};

int main()

{

    const A a;

    A b;

    a.fun();

    b.fun();

    //a.test(); //报错 常成员不能调用普通函数

    b.test();

    a.test2();

    b.test2(); //“普通”成员能调用const成员函数 因为普通指针能转换为常量指针

}

结果

fun const
fun

总结

  1. 我们可以通过常量指针与普通指针来重载函数
  2. 由于常量指针不能向普通指针转换,因此我们不能向参数为普通指针的函数传入常量指针。故我们不能通过const对象调用普通成员函数。
  3. 普通指针能转换为常量指针。故普通对象能调用普通函数也能调用常函数

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

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

相关文章

PyArmor 一键加密

使用&#xff1a; pyarmor obfuscate main.py 参考&#xff1a;Python代码加密方案_python加密代码_wgr_1009的博客-CSDN博客 一 简介 PyArmor是用于保护Python代码的工具&#xff0c;它可以将Python脚本编译成加密的字节码&#xff0c;以增加代码的保护性。它的主要目的是防…

贪心算法求数组中能组成三角形的最大周长

题目&#xff1a;三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形&#xff0c;返回0。 分析&#xff1a; 对数组排序&#xff0c;再从大到小选择三个数&#xff0c;再…

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…

Java 日期格式(yyyy-MM-dd HH:mm:ss SSS)

常用格式为&#xff1a;yyyy-MM-dd HH:mm:ss 以 2019-12-31 06:07:59:666 时间为例&#xff1a; 字符 含义 Example y&#xff08;小写的y&#xff09; 年 yyyy---->2019 M&#xff08;大写的M&#xff09; 月 MM---->12 d&#xff08;小写的d&#xff09; 一…

速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

一个完整的嵌入式系统&#xff0c;包括任务执行部分和人机交互部分。在前四节中&#xff0c;我们已经讲解了LED、LCD和按键&#xff0c;用这三者就能够实现一个人机交互系统&#xff0c;也即搭建整个嵌入式系统的框架。在后续&#xff0c;只要将各个功能加入到这个交互系统中&a…

单体版ruoyi表格绑定按钮

先需要在表格中添加一个按钮&#xff0c;可以快速操作这条数据的某个0/1状态 表格的列 editFlag是检验用户是否有操作的权限 var editFlag [[${permission.hasPermi(pipayshop:itemCommoidtyInfoCategoryTop:edit)}]]; 绑定状态条 /* 用户状态显示 */function statusTools(…

分布式图数据库 NebulaGraph v3.6.0 正式发布,强化全文索引能力

本次 v3.6.0 版本&#xff0c;主要强化全文索引能力&#xff0c;以及优化部分场景下的 MATCH 性能。 强化 强化增强全文索引功能&#xff0c;具体 pr 参见&#xff1a;#5567、#5575、#5577、#5580、#5584、#5587 优化 支持使用 MATCH 子句检索 VID 或属性索引时使用变量&am…

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于AdaBoost算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 AdaBoost(Adaptive Boosting)是一种集成学习算法,它通过组合多个弱分类器来构建一个更强大的分类器。下面是AdaBo…

C++ 对象生成:构造函数

对象生成&#xff1a;构造函数 一、构造函数特性二、三种构造函数1.无参构造函数2.有参构造函数3.拷贝构造函数 一、构造函数特性 C编译器提供了构造函数供程序生成对象这是一个与类同名的函数&#xff0c;参数可以有多种形式&#xff08;重载&#xff09;没有返回类型声明一般…

3d max省时插件CG MAGIC功能中的材质参数可一键优化!

渲染的最终结果就是为了让渲染效果更加真实的体现。 对于一些操作上&#xff0c;可能还是费些时间&#xff0c;VRay可以说是在给材质做加法的路上越走越远&#xff0c;透明度、凹凸、反射等等参数细节越做越多。 对于材质参数调节的重要性大家都心里有数的。 VRay材质系统的每…

IDEA源码下载失败问题

1.IDEA下载源码报 java.lang.RuntimeException: Cannot reconnect java.lang.RuntimeException: Cannot reconnect 异常通常表示无法重新连接到资源或服务。这种情况可能出现在尝试重新连接到数据库、网络套接字或任何需要连接的资源时。 以下是解决此异常的几种可能方法&…

语言基础2 矩阵和数组

语言基础2 矩阵和数组 矩阵和数组是matlab中信息和数据的基本表示形式 可以创建常用的数组和网格 合并现有的数组 操作数组的形状和内容 以及使用索引访问数组元素 用到的函数列表如下 一 创建 串联和扩展矩阵 矩阵时按行和列排列的数据元素的二维数据元素的二维矩…

C# File.ReadAllLines()报错

项目中需要读取一个文本文件的内容&#xff0c;调用C#的File.ReadAllLines(path)方法&#xff0c;但是报错&#xff0c;就提示unknown exception&#xff0c;也没其他提示了。 文件是在的&#xff0c;并且&#xff0c;如果把文件拷贝到另外一个路径&#xff0c;再次读取是正常…

c++ | uint8_t、uint16_t、unint32_t 和size_t

头文件 #include <stdint.h> // for C #include <cstdint> // for Cuint8_t、uint16_t、unint32_t 这三个分别是表示无符号整型&#xff0c;不同点是他们的长度不同&#xff0c;分别是8位机器位、16、32&#xff0c;也就是一个字节、两个字节、四个字节 注意在…

Angular16的路由守卫基础使用

Angular16的路由守卫基础使用 使用ng generate guard /guard/login命令生成guard文件因新版Angular取消了CanActivate的使用&#xff0c;改用CanActivateFn&#xff0c;因此使用router跳转需要通过inject的方式导入。 import { inject } from angular/core; import { CanActi…

低光图像增强:利用深度学习的LLNet与图形用户界面进行优化的实践

第一部分&#xff1a;引言与LLNet概述 随着技术的快速进步&#xff0c;图像增强已经变得日益重要。低光照条件下的图像经常受到噪声、模糊和颜色失真的影响&#xff0c;这使得图像的质量受到损害。为了解决这一问题&#xff0c;研究者们开发了多种技术来增强低光图像。其中&am…

Pytorch的torch.utils.data中Dataset以及DataLoader等详解

在我们进行深度学习的过程中&#xff0c;不免要用到数据集&#xff0c;那么数据集是如何加载到我们的模型中进行训练的呢&#xff1f;以往我们大多数初学者肯定都是拿网上的代码直接用&#xff0c;但是它底层的原理到底是什么还是不太清楚。所以今天就从内置的Dataset函数和自定…

数据可视化:图表绘制详解

数据可视化是一种将抽象的数字和数据转化为直观图形的技术&#xff0c;使数据的模式、趋势和关系一目了然。本文将详细介绍如何绘制各种类型的图表&#xff0c;包括柱状图、折线图、饼图、散点图和热力图等。 第一部分&#xff1a;图表类型和选择 1. 柱状图 柱状图是用于比较类…

c++通过gsop调用基于https的webservice接口总结

ww哦步骤&#xff1a; 第一步&#xff1a;生成头文件 webservice接口一般会有一个对外接口文档。比如&#xff1a;http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL 问号后面的参数表示WSDL文档&#xff0c;是一个XML文档&#xff0c;看不懂配置没关系&a…

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查

背景 Kotlin作为一门JVM脚本语言&#xff0c;收到很多Java开发者的青睐。 项目采用JavaKotlin混合编程。Spring Boot应用开发&#xff0c;不会发生变动的配置放在本地配置文件&#xff0c;可能会变化的配置放在远程Apollo Server。 问题 因为业务需要&#xff0c;需要增加一…