C++ const的作用

news2025/9/19 20:11:56

1.const在C中是只读变量,在C++中表示常量
以下代码,在C中是错误的,但是在C++中是正确的。

void main()
{
	const int n = 10;
	int arr [n];
}

2.const不仅可以定义一个常量,也可以定义函数参数
例如:

char *strcpy(char *dest,const char*src)
int strcmp(const char*src1,const char*src2)

3.const可以定义指针

void main()
{
	int a = 10;
	const int* p1 = &a;
	int* const p2 = &a;
	int const *p3 = &a;
	const int * const p4 = &a;
}

(1)第一个const修饰的是*p1,也就是修饰的是p1所指向的内容,所以*p1不可以自加,*(p1)++;不能执行,p1++;是可以执行的。
(2)第二个const修饰的是p2本身,它所指向的内容是int,*(p2)++;可以执行,p2++;不可以执行的,因为p2本身不可以自加。
(3)第三个const修饰的是*p3,也就是修饰的是p3所指向的内容,所以*p3不可以自加,*(p3)++;不能执行,p3++;是可以执行的。
(4)第四个const修饰的是*p4,第五个const修饰的是p4本身,*(p4)++;不能执行,p4++;也不可以执行。
【说明】把const 和 int 互相颠倒对const修饰什么无影响,const修饰什么是看*,看*放在const之前还是放在const之后。
4.const可以修饰函数返回值
(1)以下代码想要在主函数直接通过a.m_i输出i的值以及修改i的值,但是都不能执行,因为m_i是私有的。

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { cout << m_i << endl; }
private:
    int m_i;
};
void main()
{
    A a(30);
    a.print();
    //cout << a.m_i << endl;  //错
    //a.m_i = 50;      //错
}

【运行结果】
请添加图片描述
(2)我们可以给一个接口GetI()函数,用来获取m_i的值,此时就可以通过a.GetI输出m_i的值,但是仍然不能通过a.GetI去修改m_i的值。

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { cout << m_i << endl; }
    int GetI()
    {
        return m_i;
    }    
private:
    int m_i;
};
void main()
{
    A a(30);
    a.print();
    cout << a.GetI() << endl;
    //a.GetI() = 50;   //错
}

【运行结果】
请添加图片描述
不能通过a.GetI()修改m_i的值是因为a.GetI()不能作为左值,因为左边的表达式a.GetI()返回m_i,不是把m_i本身返回,是相当于把m_i的值先给了一个临时变量,再把临时变量的值返回去,然后临时变量的空间也消失掉了,所以a.GetI()没有确定的内存空间,不能作为左值,因为要想作为左值必须要有一个确定的内存空间。
(3)如果我们想通过a.GetI()修改a.m_i的值,可以给int GetI()加一个引用,变成int& GetI(),因为引用是当前实体的别名,相当于把m_i本身返回去,此时a.GetI()可以作为左值,就可以通过a.GetI()来修改a.m_i的值

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { cout << m_i << endl; }
    int& GetI()
    {
        return m_i;
    }
private:
    int m_i;
};
void main()
{
    A a(30);
    a.print();
    a.GetI() = 50;
    cout << a.GetI() << endl;
}

【运行结果】
请添加图片描述
(4)用const修饰函数返回值:const int& GetI(),此时又不能通过a.GetI()来修改a.m_i的值,但是可以通过a.GetI()来输出a.m_i的值也可以把a.GetI()放在右边。

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { cout << m_i << endl; }
   const int& GetI()
    {
        return m_i;
    }
private:
    int m_i;
};

void main()
{
    A a(30);
    a.print();
    cout << a.GetI() << endl;
    //a.GetI() = 50;    //错
}

【运行结果】
请添加图片描述
比较以下两部分代码:

    int GetI()
    {
        return m_i;
    }    
   const int& GetI()
    {
        return m_i;
    }

(1)第一部分代码的返回值是临时的m_i,临时变量不能作为左值,所以不能修改m_i的值,第二部分代码返回的时候没有生成临时的变量,返回的值就是m_i本身,但是因为加了const所以不能修改m_i的值。
(2)第二部分代码相比较第一部分代码的好处是,第二部分代码虽然因为加了const不能作为左值,但是它返回的就是m_i本身,而第一部分代码不仅不能作为左值被修改,还生成了临时变量,最终临时变量要消失,空间要释放,开辟空间,释放空间,效率就变慢了。
5.const可以修饰常成员函数,const写在函数参数之后

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { cout << m_i << endl; }
    void print()const { cout << "const" << m_i << endl; }
    //上面两个函数构成重载,函数后面加const可以构成重载
   const int& GetI()const   //常成员函数,在当前函数中不能修改本类数据成员的值
    {
    	//m_i = 40; //错
        return m_i;
    }
private:
    int m_i;
};
void main()
{
    A a(30);
    const A b(50);  //常对象
    a.print();
    b.print();
    cout << a.GetI() << endl;
}

【运行结果】
请添加图片描述
【说明】
(1)函数后面加const可以构成函数重载。
(2)函数后面加const叫做常成员函数,常成员函数在当前函数中不能修改本类数据成员的值。
(3)常对象在调用成员函数的时候调用的是常成员函数,如果是非常对象那么调用的就是非常成员函数。如b调用的是void print()const常成员函数,a调用的是void print()非常成员函数。
①如果没有非常成员函数,那么a也会调用常成员函数void print()const。因为虽然a不是常对象,可以修改也可以不修改,它如果调用常成员函数,虽然常成员函数不能修改数据成员的值,但是并不冲突。所以非常对象可以调用常成员函数。

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    //void print() { cout << m_i << endl; }
    void print()const { cout << "const" << m_i << endl; }
private:
    int m_i;
};
void main()
{
    A a(30);
    const A b(50);  //常对象
    a.print();
    b.print();
}

【运行结果】
请添加图片描述
②如果没有常成员函数,那么常对象b不会调用非常成员函数void print()

class A
{
public:
    A(int i = 0)
    {
        m_i = i;
    }
    void print() { m_i = 10;cout << m_i << endl; }
    //void print()const { cout << "const" << m_i << endl; }
private:
    int m_i;
};
void main()
{
    A a(30);
    const A b(50);  //常对象
    a.print();
    b.print();
}

以上代码不能执行,因为b是const类型的,如果可以调用非常成员函数,那么在非常成员函数中会存在修改m_i的情况,但是b是const类型的就意味着不可以修改m_i的值,这两者冲突。所以常对象不能调用非常成员函数。

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

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

相关文章

一次弄懂gzip模块启用和配置指令

接下来所学习的指令都来自ngx_http_gzip_module模块&#xff0c;该模块会在nginx安装的时候内置到nginx的安装环境中&#xff0c;也就是说我们可以直接使用这些指令。 1. gzip指令&#xff1a;该指令用于开启或者关闭gzip功能 注意只有该指令为打开状态&#xff0c;下面的指令才…

联想凌拓 ThinkSystem DE 系列全闪存阵列

ThinkSystem DE 系列全闪存阵列 超高的性能&#xff0c;极具竞争力的价格 通过消除过量配置最大限度地提高效率&#xff0c;同时通过降低空间、电源和冷却要求来降低成本。 利用高级数据保护&#xff0c;在本地或从远距离上防止数据丢失和停机事件。 在模块化 2U 构建模块中…

ModStartBlog v7.1.0 ChatGPT支持,界面全新优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

【ChatGPT】ChatGPT-5 强到什么地步?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 ChatGPT-5 强到什么地步&#xff1f; 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…

2.含电热联合系统的微电网运行优化(文章复现)

说明书 相关代码资源&#xff1a;基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于拉丁超立方法的风光场景生成与削减 粒子群综合能源系统优化的matlab实现 智能微电网PSO优化算法 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网…

基于PINN的极少监督数据二维非定常圆柱绕流模拟

2022年10月16日-19日&#xff0c;亚洲计算流体力学会议在韩国九州举办。会议涌现了不少结合人工智能技术进行流体力学模拟的论文成果&#xff0c;这说明人工智能技术逐渐渗透流体力学模拟领域。百度与西安交通大学的研究人员一起&#xff0c;利用飞桨框架和科学计算工具组件Pad…

生成式人工智能所面临的问题有哪些?

在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能&#xff0c;您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术&#xff0c;旨在生成与训练数据相似但不完全相同的新数据。 换句话说&#xff0c;…

WPS C++ 二次开发 Demo运行

1.官网二次开发地址&#xff1a;https://open.wps.cn/docs/client/wpsLoad 2.Demo源码下载&#xff1a; 经过测试上述链接找不到demo源码&#xff0c;可通过git命令下载&#xff1a; git clone https://code.aliyun.com/zouyingfeng/wps.git -b dev 图中cpp文件夹即为cdemo源码…

<Linux>进程概念

文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…

sql语法:事务的”那些事“

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录前言一、事务是什么&#xff1f;二、事务的特点三、如何提交事务和回滚事务?3.1 手动提交3.2 自动提交模式下开启事务3.3 注意事项四、事务的隔离级别4.1 模拟事务安全问题4.1.1 脏读问题模拟如下&#xff1…

11.Java面向对象----多态

Java面向对象—多态 面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统…

Nacos介绍与安装

文章目录一、什么是Nacos(摘抄自官网介绍)二、Nacos安装2.1 下载安装包2.2 解压2.3 配置端口2.4.启动2.5.访问一、什么是Nacos(摘抄自官网介绍) Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发…

【模型复现】densenet,增加残差结构连接,复用特征图的角度降低了计算量还提升了精度,transition_block压缩特征图

相比ResNet&#xff0c;DenseNet[1608.06993] Densely Connected Convolutional Networks (arxiv.org)提出了一个更激进的密集连接机制&#xff1a;即互相连接所有的层&#xff0c;具体来说就是每个层都会接受其前面所有层作为其额外的输入。下图为DenseNet的密集连接机制。可以…

聚观早报|Uber分拆旗下网约车服务; 字节跳动首度超越腾讯和阿里

今日要闻&#xff1a;Uber分拆旗下网约车服务Careem&#xff1b;字节跳动首度超越腾讯和阿里&#xff1b;搜狗追上GPT-4需要3年左右&#xff1b;苹果首款头戴装置将延至6月量产&#xff1b;全面注册制新规今起正式落地Uber分拆旗下网约车服务Careem Uber 旗下网约车服务 Careem…

【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )

文章目录一、问题提出二、绝对定位 居中设置1、设置固定尺寸2、先偏移50%再回退固定值三、绝对定位元素 水平 / 垂直 居中一、问题提出 绝对定位 不能通过 设置 margin: auto; 样式的方式 , 设置盒子模型水平居中 ; 相对定位 的 盒子模型 , 并没有脱离标准流限制 , 仍然可以使…

notion插件:为你的工作流带来新生

在本文中&#xff0c;我们将介绍Notion的几款有助于提高生产力的插件。这些插件将加强Notion的功能&#xff0c;并为你的工作流程带来更多的便利。 我们特地为你准备了这本漫游指南&#xff1a;收录各种工具、信息和资源&#xff0c;携你共同探索浩瀚美丽的互联网海洋。 snackt…

23种设计模式-抽象工厂模式

抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责创…

数据结构与算法六 树

一 二叉树入门 之前我们实现的符号表中&#xff0c;不难看出&#xff0c;符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n),为了提高运算效率&#xff0c;接下来我们学习树这种数据结构。 1.1 树的基本定义…

流程引擎基础知识

流程引擎基础知识流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repo…

如何使用ChatGPT在1天内完成毕业论文

如何使用ChatGPT在1天内完成毕业论文 几天前&#xff0c;亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文&#xff0c;世道要变&#xff0c;要学会使用黑科技才能混的下去。废话到此结束&#xff0c;下面说明这么用AI生成自己的论文。 使用工具&#xff1a; 1. P…