首页 > 其他分享 >关于类和结构体中的const

关于类和结构体中的const

时间:2023-12-11 11:14:49浏览次数:17  
标签:const 函数 int 成员 DataType 关于 体中 mprivate

一个const类型的类是无法调用非const类型的成员函数的,因此stl容器中类的成员函数都会有const的重载版本,因为不清楚用户会初始化const的类实例还是非const的类实例。

如下就是一个非法代码

#include <iostream>

struct DataType{
    int _m_public;
    DataType(int _m_pub, int _m_pri) : _m_public(_m_pub), _m_private(_m_pri){
        std::cout << "ctor" << std::endl;
    };
    void add_mprivate(){
        ++_m_private;
    }
    void show_mprivate(){
        std::cout << "_m_private: " << this->_m_private << std::endl;
    }

private:
    int _m_private;
};

using DT = struct DataType;

int main(){
    const DT data(1, 1);
    std::cout << "====== init\n";
    std::cout << data._m_public << "\n";
    data.show_mprivate();
}

我定义了一个const类型的结构体,因为它是const类型的,所以他不能访问非const类型的成员函数。因为const的类或结构体意味着整个类内的成员变量是不可修改的,而调用非const的成员函数有可能会造成成员变量的修改,所以在编译器看来这是不合法的,就会有如下错误

test.cc: In function ‘int main()’:
test.cc:25:24: error: passing ‘const DT’ {aka ‘const DataType’} as ‘this’ argument discards qualifiers [-fpermissive]
     data.show_mprivate();
                        ^
test.cc:11:10: note:   in call to ‘void DataType::show_mprivate()’
     void show_mprivate(){
          ^~~~~~~~~~~~~

因此,我需要再重载一份const的成员函数(对于show_mprivate这种不改变成员变量的成员函数是可以的)

#include <iostream>

struct DataType{
    int _m_public;
    DataType(int _m_pub, int _m_pri) : _m_public(_m_pub), _m_private(_m_pri){
        std::cout << "ctor" << std::endl;
    };
    void add_mprivate(){
        ++_m_private;
    }
    void show_mprivate(){
        std::cout << "_m_private: " << this->_m_private << std::endl;
    }

    void show_mprivate() const {
        std::cout << "_m_private: " << this->_m_private << std::endl;
    }

private:
    int _m_private;
};

using DT = struct DataType;

int main(){
    const DT data(1, 1);
    std::cout << "====== init\n";
    std::cout << data._m_public << "\n";
    data.show_mprivate();
}

但是对于add_mprivate函数,我们不能重载一份他的const版本,因为这个函数一定会修改成员变量,所以当class或者struce定义为const类型时,意味着成员变量不可修改,这种成员函数本身就是不能被调用的。

标签:const,函数,int,成员,DataType,关于,体中,mprivate
From: https://www.cnblogs.com/wangtianning1223/p/17893895.html

相关文章

  • Adobe Photoshop Elements 2024 v24.0 简体中文版 | 中文直装版
    下载:资源下载介绍:PhotoshopElements2024(简称PSE即PS简化版)是一款定位在数码摄影领域的全新的图像处理软件,该软件包括了专业版的大多数特性,只有少量的简化选项,提供了调整颜色和光线,去除划痕,修复旧照片,打开闭合的眼睛等实用功能,非常方便。除此之外,这款软件操作简单,使用方......
  • 关于代码质量度量和分析的一些总结
     最近团队做CMMI3认证,这期间涉及到了代码质量度量。花了点时间做了总结,分享给大家。先看一张整体的图,然后逐个指标展开说明。 一、单元测试覆盖率单元测试覆盖率(Coverage)是一个度量单元测试覆盖了多少代码的指标。它是一种衡量测试质量的方法,用来指示我们的测试用例覆盖了......
  • 关于Mybits三层架构的项目操作
    概述本篇文章用来记录如何使用mybits在三层架构中进行简单的增删改查操作,下面我们进入管理系统的场景下进行操作,这个管理系统中的增删改查的大体逻辑基本逻辑。首先三层架构中colltroller:用来接收和传递参数值service:在这层调用mapper接口中的方法或者回调的函数数据mapper:......
  • 关于代码质量度量和分析的一些总结
    最近团队做CMMI3认证,这期间涉及到了代码质量度量。花了点时间做了总结,分享给大家。先看一张整体的图,然后逐个指标展开说明。 一、单元测试覆盖率单元测试覆盖率(Coverage)是一个度量单元测试覆盖了多少代码的指标。它是一种衡量测试质量的方法,用来指示我们的测试用例覆盖了代码......
  • 关于开源项目QGIS源码的分析
    QGIS地址:https://github.com/qgis/QGIS#1-flexible-and-powerful-spatial-data-managementQGIS是一个开源的地理信息系统(GIS)软件项目。采用的技术栈QGIS的主要技术栈涵盖了多个领域,包括图形用户界面,地理信息数据处理、数据库集成以及插件开发QT:QGIS的图形用户界面采用Q......
  • 关于 Mumble开源语音聊天软件项目的的分析
    开源地址https://github.com/mumble-voip/mumbleMumbleMumble:语音通信软件低延迟、高质量低延迟通信C/S(Client/Server)跨平台(跨风俗来运行)Opus音频编码器SSL/TLS加密源码整体结构分析mumble/src/client.ts用于本地化(翻译)的内容由外部服务处理......
  • 顶层const 和 底层const
    在C++中,const关键字可以用于创建常量,这意味着一旦定义,其值就不能改变。const可以修饰变量、指针、引用等,根据const修饰的对象不同,我们将其分为顶层const和底层const。顶层const:当const修饰的是对象本身,即对象本身不可被修改,我们称之为顶层const。例如,对于constinta=10;,a......
  • 关于博客园使用Markdown编辑器但是[TOC]无法正常生成目录
    目录这是一级标题这是二级标题这是三级标题这是四级标题一、fdisk工具创建一个磁盘分区1、虚拟机添加测试硬盘2、创建磁盘分区3、文件系统管理磁盘分区4、挂载二、parted命令使用场景操作命令'help'查看命令列表查看分区情况划分出主分区"parted1"删除分区格式化操作设置开机自动......
  • 关于字符串
    函数字符相关函数●isupper():判断一个字符是否是大写字母●islower():判断一个字符是否是小写字母●isalpha():判断一个字符是否是字母●isdigit():判断一个字符是否是数字字符●isalnum():判断一个字符是否是数字或字母字符相关转换函数●toupper():将小写字母转......
  • 关于键盘导航顺序和 tabindex 属性的关联关系
    "tabindex"属性是HTML元素中的一个属性,用于定义元素在通过键盘导航时的顺序。该属性接受一个整数值,通常为正整数,用于指定元素的tab键顺序。但是,当"tabindex"属性的值为-1时,它有特殊的含义。当"tabindex"的值为-1时,它表示该元素虽然可以通过JavaScript聚焦,但在通过按下Tab键进行导......