【C++】const关键字

news2024/11/16 7:21:55

【C++】const关键字

0x1 常量

C++定义常量有两种方式

#define 宏常量:#define 常量名 常量值

  • 通常在文件上方定义,表示一个常量
  • 宏常量不可以修改
// 宏常量
#define MAX 999

int main() {
	return 0;
}

const修饰的变量: const 数据类型 常量名 = 常量值

  • 通常在变量定义前加关键字const,修饰该变量为常量,不可修改
  • 常量不可以修改,const限定为只读状态,防止修改操作
int main() {
	// const修饰变量
	const int season = 4;
	cout << "一年里总共有 " << season << " 个季节" << endl;
	return 0;
}

0x2 const修饰指针

const修饰指针有三种情况:

  • const修饰指针——常量指针( const int *p = &a )
  • const修饰常量——指针常量( int * const p = &a )
  • const即修饰指针,又修饰常量(const int * const p = &a )

0x21 常量指针

常量指针:指针的指向可以修改,但是指针指向的值不可以修改。

0x22 指针常量

指针常量:指针的指向不可以修改,但是指针指向的值可以修改。

0x23 const既修饰指针又修饰常量

特点:指针的指向不可以修改,指针指向的值也不可以修改。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxpWYsut-1672238300469)(null)]

总结

0x3 const修饰结构体

用const来防止修改操作

//
// Created by mxz on 2022/12/28.
//

#include <iostream>
#include<string>

using namespace std;

// 结构体定义
struct Person {
    string name;  // 姓名
    int age;      // 年龄
};

// 将函数中的形参修改为指针,可以减少内存空间的使用,即不会复制新的副本出来占用空间
void printPerson(const Person *person) // 加const防止函数体中的修改操作
{
    // stu->age = 20;                                    // 操作失败,因为加了const修饰
    cout << "姓名:" << person->name << " 年龄:" << person->age << endl;
}

int main() {
    Person per = {"后端码匠", 18};
    printPerson(&per);

    return 0;
}

0x4 常量引用

常量引用主要用来修饰形参,防止形参改变实参

int & ref = 20 // 错误,引用本身需要一个合法的内存空间,20是一个常量

const int & ref = 10// 正确,加上const之后,编译器将代码修改为 int temp = 10; const int & ref = temp;
ref = 18;           // 错误,此时的ref已经是常量,变为只读状态,所以不可以修改

//
// Created by mxz on 2022/12/28.
//

#include <iostream>

using namespace std;

// 打印数据函数
void showValue(const int &val) {
    //val = 100; // 错误,val现在为只读状态
    cout << "val=" << val << endl;
}

int main() {

    //函数中利用常量引用防止误操作修改实参
    int b = 10;
    showValue(b);

    return 0;
}

总结

实际上和const修饰结构体一样,当需要打印数据时,并且当数据量太大,不想复制一份数据到内存空间时,就传一个地址或者引用,此时形参改变,实参也会跟着改变,所以此时需要防止实参被修改!

0x5 const修饰成员函数

0x51 常函数

  • 成员函数后加const后我们称为这个函数为常函数
  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改
//
// Created by mxz on 2022/12/28.
//

#include <iostream>

using namespace std;

class Person {
public:
    // this指针的本质是一个指针常量(Type* const pointer;),指针的指向不可修改,但是指针指向的值可以修改
    // 如果想让指针指向的值也不可以修改,需要声明常函数,即在成员函数后面加上const

    void ShowPerson() const {

        // m_A = 100;     // 错误,函数加上了const,属性不可以修改
        /**
         * m_A = 100 的本质是 this->m_A = 100,this指针指向的对象的数据是可以修改的
         * this指针的本质是指针常量,this指针的指向不可以修改,即this = NULL; 错误
         * 此处的this指针的本质是指针常量:Person * const this;
        */
        /**
         * 在成员函数后面加const,修饰的是this指针,让this指针指向的值也不可以修改
         * const Person * const this;指针的指向,以及指针指向的值都不可以修改
        */
        this->m_B = 100; // 正确,因为加上了mutable关键字

    }

public:
    int m_A;
    mutable int m_B; // 加上mutable关键字之后成为特殊变量,即使在常函数中,也可以修改这个值
};

void test01() {
    Person person;
    person.ShowPerson();
}

int main() {
    test01();
    return 0;
}

0x52 常对象

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数,普通对象既可以调用普通成员函数,也可以调用常函数
//
// Created by mxz on 2022/12/28.
//

#include <iostream>

using namespace std;

class Person {
public:
    void ShowPerson() const {
        // m_A = 100; // 错误,函数加上了const,属性不可以修改
        this->m_B = 100; // 正确,因为加上了mutable关键字
    }

    void func() {

    }

public:
    int m_A;
    mutable int m_B; // 加上mutable关键字之后成为特殊变量,即使在常函数中,也可以修改这个值
};

void test02() {
    const Person p = {1, 2}; // 在对象前加const,变为常对象
    // p.m_A = 100;        // 错误,常对象不允许修改成员属性
    p.m_B = 100;            // 正确,m_B是特殊值,在常对象下也可以修改

    //常对象只能调用常函数
    p.ShowPerson();          // 正确
    // p.func();             // 错误,因为普通成员函数可以修改成员属性,而常对象的本质是不允许修改成员属性
}

int main() {
    test02();
    return 0;
}

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

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

相关文章

docker 安装Es

1、下载镜像文件 docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据 2、创建实例 1、ElasticSearch mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.host: 0.0.0.0" >…

第三十六章 数论——容斥原理

第三十六章 数论——容斥原理一、容斥原理1、定理内容二、代码模板1、问题&#xff08;1&#xff09;如何求出能够被整除的个数&#xff1f;&#xff08;2&#xff09;如何枚举出2n−12^n-12n−1种情况&#xff1f;2、代码实现&#xff1a;一、容斥原理 1、定理内容 我们在高…

开启微信小程序的学习窗口(第一课)

第一个问题 什么是微信小程序 微信小程序&#xff0c;小程序的一种&#xff0c;英文名Wechat Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。 全面开放申请后&#xff0…

Educational Codeforces Round 93 (Rated for Div. 2) K. Lonely Numbers

Problem - C - Codeforces 翻译&#xff1a; 给定一个数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;&#xff0c;由0到9的整数组成。一子数组&#x1d44e;&#x1d459;,&#x1d44e;&#x1d459; 1,&#x1d44e;&…

R实战 | 置换多元方差分析(以PCoA的PERMANOVA分析为例)

adonis-cover置换多元方差分析&#xff08;Permutational multivariate analysis of variance&#xff0c;PERMANOVA&#xff09;&#xff0c;又称非参数多因素方差分析&#xff08;nonparametric multivariate analysis of variance&#xff09;、或者ADONIS分析。它利用距离矩…

第003课 - 分布式基础概念

文章目录 集群、分布式、节点远程调用负载均衡服务注册/发现和注册中心服务熔断和降级API网关我们以前将所有的代码、页面、sql语句,写到一个应用,如果有一个地方有问题,整个就不可用了。 我们可以基于业务边界进行服务微化和拆分。 如果有一个出现了问题,不影响其他服务…

迅为LS2K0500开发板龙芯全国产处理器LoongArch架构核心主板

全国产开发板&#xff1a; 迅为iTOP-LS2K0500开发采用龙芯LS2K0500处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;架构&#xff0c;片内集成64位LA264处理器核、32位DDR3控制器、2DGPU、DVO显示接口、两路PCle2.0、两路SATA2.0、四路USB2.0、一路US…

梯度下降算法、随机梯度下降算法、动量随机梯度下降算法、AdaGrad算法、RMSProp算法、Adam算法详细介绍及其原理详解

相关文章 梯度下降算法、随机梯度下降算法、动量随机梯度下降算法、AdaGrad算法、RMSProp算法、Adam算法详细介绍及其原理详解反向传播算法和计算图详细介绍及其原理详解 文章目录相关文章前言一、回归拟合问题二、损失函数三、梯度下降算法四、随机梯度下降算法五、动量随机梯…

国际山岳日,周大福百年承诺续写永恒美好

纵横古今&#xff0c;俯瞰万里 每一寸绿野都孕育万物生机 每一座山林都彰示生命之本 百周年承诺 守护自然生态 周大福珠宝集团坚守“用真诚让幸福永恒“的企业理念 我们的百周年承诺包括对地球真诚且有效的付出服务 致力守护珍贵的大自然环境&#xff0c;为人类和星球幸福…

吉林优美姿文化:抖音怎么做爆款输出?

要知道&#xff0c;现在自媒体发展的越来越好了&#xff0c;其中发展的最好的就是抖音平台&#xff0c;大家如果要利用抖音平台达到引流的目的的话&#xff0c;也要去学习一下抖音相关的技巧&#xff0c;那么抖音怎么去买号呢&#xff1f;跟着吉林优美姿小编来一起看看吧&#…

亚马逊---人工智能入门---学习笔记

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;蓝桥杯算法笔记 &#x1f4ac;总结&#xff1a;希望你看完之…

SpringBoot 的配置

目录 配置文件到底有什么作用呢 ? SpringBoot的配置文件的格式有哪些呢? properties配置文件 yml配置文件 properties乱码问题 多平台的配置文件设置 配置文件到底有什么作用呢 ? 配置文件主要是配置项目的一些重要的数据.. 比如配置数据库的连接信息 数据库是非常重…

虚拟机中如何安装Liunx环境

安装步骤 首先 准备一个Linux系统镜像 这是下载地址&#xff1a;https://cn.ubuntu.com/download/server/step1 然后打开虚拟机软件&#xff0c;点击新建 配置虚拟机名称 配置内存【建议4GB&#xff0c;内存小就少弄一顿】【再点击下一步】 硬盘配置 点击下一步 到这一步&am…

MVP、原型、概念验证,傻傻分不清楚?

MVP、原型以及概念验证这三者的概念虽然没有密切的联系&#xff0c;但也有不少人会分不清这三者的区别&#xff0c;在这篇文章中&#xff0c;我们会帮大家区分一下这三个概念。 首先是MVP&#xff0c;MVP是Minimum Viable Product的缩写&#xff0c;即最小可行性产品。MVP通过…

计算机网络---DHCP和自动配置

什么是DHCP HCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议&#xff0c;客户机 / 服务器协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Se…

在SPDK中体验一下E810网卡ADQ直通车

早在2019年&#xff0c;Intel发布第二代Xeon Scalable系列处理器的同时&#xff0c;也推出了E800系列网卡。该网卡的亮点除了支持100Gb&#xff0c;便是新增了ADQ功能。1. 了解ADQADQ 全称Application Device Queues&#xff0c;是一种队列和控制技术&#xff0c;可提高应用程序…

44. 含并行连结的网络(GoogLeNet)

GoogLeNet吸收了NiN中串联网络的思想&#xff0c;并在此基础上做了改进。 这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟&#xff0c;以前流行的网络使用小到1 * 1&#xff0c;大到11 * 11的卷积核。 本文的一个观点是&#xff0c;有时使用不同大小的卷积…

unreal engine 增强输入的使用分析

由于ue5以前的输入 系统已经提示被弃用了&#xff0c;因此建议使用新版本 首先 分别新建输入操作 新建映射情景 image.png打开新建的输入操作 根据下图可以得出结论&#xff0c;此东西用于描述 是何种类型映射&#xff0c;以及是否消耗事件 不传递 image.pngimage.png打开情景上…

用Python绘制一朵玫瑰花,送给特别的她

前言 哈喽哈喽&#xff0c;跨年倒计时三天九小时 上次发了烟花的文章&#xff0c;看来还是蛮多人需要代码的 今天就来搞一朵唯一的花吧~&#xff08;送给你喜欢的那个她&#xff09; 效果 话不多说 咱先直接看看效果&#xff0c;毕竟搞的不好看我也拿不出手 提前先说 我尽…

CANopen3.0-数据格式

一、CAN消息 一帧CAN消息的通信协议如下: 其中, id: CAN消息的标识符,通常是11bits rtr: 0–消息帧,普通消息;1–远程帧,远程传输请求消息,这种类型的消息不能包含数据帧; dn: 数据帧,一帧普通CAN消息包括0~8bytes数据 在CANOpen中需要自己实现CAN发送消息接口,类似…