const对象不能调用其他非const成员函数,const成员函数不能调用其他非const成员,

news2024/9/28 7:26:18

在C语言中我们知道const关键字修饰的变量具有常量属性,简称常变量。即修饰后的变量不能再次修改,而C++中是兼容C语言的,同样具备该特性,但C++引入了引用(&)所以const的用法就更多了。

我们知道引用的对象必须是个变量,不能有常属性,所以用const修饰过的对象就不能引用。

const对象不能调用非const成员函数
 

class Date
{
public:
	Date(int year=2023)
		:_y(1970)
	{
		_y = year;
	}
	void Print() 
	{
		cout << _y << "年" <<endl;
	}
private:
	int _y;

};
int main()
{
	const Date d1;
	d1.Print();
}

如上d1由const修饰,此时编译就不会通过,会报错:

不兼容,就是说明d1被const修饰过,具有常属性,不能调用。+

由于调用成员函数时会隐式的自动发生传参,传d1的指针,而在成员函数中右Date* this来接受,此时此时就类型不兼容。归根结底还是怕你会改变d1对象的值,因为隐式传的是地址(类似引用),而指针this接收,this指向的其实也是d1对象的空间,所以就会报错。

但是如果你传参传d1就是没问题的


class Date
{
public:
	Date(int year=2023)
		:_y(1970)
	{
		_y = year;
	}
	void Print(Date d) 
	{
		cout << _y << "年" <<endl;
	}
private:
	int _y;

};
int main()
{
	const Date d1;
	Date d;
	d.Print(d1);
}

解决方法

 所以为了类型兼容祖师爷就有他的解决方法:(成员函数末尾加const修饰)

 

const成员函数不能调用其他非const成员

class Date
{
public:
	Date(int year=2023)
		:_y(1970)
	{
		_y = year;
	}
	void out()
	{
		cout << "haha" << endl;
	}
	void Print() const
	{
		cout << _y << "年" <<endl;
		out();
	}
private:
	int _y;

};
int main()
{
	const Date d1;
	d1.Print();
}

看看这个,创建了一个out成员函数,在Print成员函数中调用该函数,同样报错:

 报错原因相同:不兼容。归根结底还是隐式传参,调用out成员函数时,实际也发生了传参,传的是*this,也就是d1对象,而d1是经过const修饰了的,所以类型不兼容,同样在out成员函数末尾加上const进行修饰就可以编译通过了。

class Date
{
public:
	Date(int year=2023)
		:_y(1970)
	{
		_y = year;
	}
	void out()const
	{
		cout << this << endl;
	}
	void Print() const
	{
		cout << this << endl;
		out();
	}
private:
	int _y;

};
int main()
{
	const Date d1;
	d1.Print();
}

 

还有一个小知识点:const修饰的对象在创建的时候就必须进行初始化,引用也是一样的。

 

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

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

相关文章

rust 闭包函数

函数有自己的类型&#xff0c;可以像使用基础类型一样使用函数&#xff0c;包括将函数保存在变量中、保存在 vec 中、声明在结构体成员字段中。闭包函数也是函数&#xff0c;也有自己的类型定义。不过&#xff0c;函数实际上是指针类型&#xff0c;在 rust 所有权中属于借用的关…

主从搭建失败的原因

1、Slave_IO_Running是connecting&#xff0c;Slave_SQL_Running是yes 是因为从机使用配置的主机信息没有登陆到主机里面&#xff01;修改(从机里面) 2、Slave_IO_Running是yes&#xff0c;Slave_SQL_Running是no 原因是主机和从机里的数据不一致&#xff1a; 导致&#xff…

轮趣科技教育版ros小车键盘控制运动

我之前买的ros小车是单独买的底板&#xff0c;以为随便一个树莓派就可以&#xff0c;因为我以前有一个树莓派3B&#xff0c;后来买了单独的小车之后&#xff0c;发现只能使用树莓派4B&#xff0c;然后又单独买了一个树莓派4B&#xff0c;给装上镜像&#xff0c;安装ros-melodic…

容斥原理 训练笔记

​ 容斥原理 设S是一个有限集&#xff0c;A_1,A_2…A_n是S的n个子集&#xff0c;则 ∣ S − ⋃ i 1 n A i ∣ ∑ i 0 n ( − 1 ) i ∑ 1 ≤ j 1 < j 2 . . . < j i ≤ n ∣ ⋂ k 1 i A j k ∣ |S-\bigcup_{i1}^{n}A_i|\sum_{i0}^{n}(-1)^i\sum_{1\leq j_1< j_2.…

简单说说SAP系统中BASIS这个Package

1. 简介 BASIS是SAP系统中非常基础的一个包&#xff0c;属于SAP_BASIS这个模块&#xff0c;这个模块其实也代表着SAP Netweaver的版本&#xff0c;通常而言&#xff0c;SAP_BASIS的版本越高&#xff0c;其所支持的功能也越丰富&#xff0c;例如功能更丰富的ABAP语法&#xff0…

UE4 unlua学习笔记

将这三个插件放入Plugins内并重新编译 创建一个BlueprintLibrary&#xff0c;声明一个全局函数 在这里声明路径 点击Create Lua Template 在Content的Script即可生成对应的lua文件打开它&#xff01; 显示以上lua代码 打印Hello Unlua 创建该UI&#xff0c;就会在创建UI的Con…

数值分析第五章节 用Python实现解线性方程组的直接解法

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第5章 解线性方程组的直接解法 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 引言与预备知识高斯消去法列主元消去法 矩阵三角分解法杜利特尔分解法平方根法 向量和矩阵的范数误差分析 引言…

剑指offer42.连续子数组的最大和

这道题挺简单的&#xff0c;看完题脑子里出现的想法就是用一个sum来把数组从前往后加&#xff0c;如果sum小于0&#xff0c;那么对于和来说是会减小的&#xff0c;所以这个时候直接把sum归零&#xff0c;然后从这个位置再往后加&#xff0c;用一个max_sum来记录sum的最大值&…

全面适配 | 走近openGauss数据库+鲲鹏欧拉操作系统

引入 全面适配 | openEuler操作系统 openGauss数据库 开篇 1、openEuler欧拉操作系统 百度百科&#xff1a;openEuler是覆盖全场景的创新平台&#xff0c;在引领内核创新&#xff0c;夯实云化基座的基础上&#xff0c;面向计算架构互联总线、存储介质发展新趋势&#xff0c;…

【LeetCode】剑指 Offer Ⅱ 第1章:整数(5道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 题目解决方案剑指 Offer II 001. 整数除法快速除 ⭐剑指 Offer II 002. 二进制加法模拟&#xff1a;StringBuilder ⭐剑指 Offer II 003. 前 n 个数字二进制中 1 的个数动规&#xff1a;res[i] res[i & (…

路由的配置

1、在router中设置路由导航跳转函数,在index.js文件中写这句话&#xff1a; 1.1 只要发生跳转, 就会调用这个函数&#xff1a; 1.2 导航的声明函数 2、访问系统访问控制系统如何形成 3、来一个导航守卫的案例&#xff1a;看看导航守卫的案例&#xff0c;写一个Main.Vue 和login…

【微软知识】微软相关技术知识分享

微软技术领域 一、微软操作系统&#xff1a; 微软的操作系统主要是 Windows 系列&#xff0c;包括 Windows 10、Windows Server 等。了解 Windows 操作系统的基本使用、配置和故障排除是非常重要的。微软操作系统&#xff08;Microsoft System&#xff09;是美国微软开发的Wi…

中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

Pytorch个人学习记录总结 10

目录 优化器 优化器 官方文档地址&#xff1a;torch.optimhttps://pytorch.org/docs/stable/optim.html Debug过程中查看的grad所在的位置&#xff1a; model --> Protected Atributes --> _modules --> ‘model’ --> Protected Atributes --> _modules -…

Linux学成之路(基础篇0(二十三)MySQL服务(主从MySQL服务和读写分离——补充)

目录 一、MySQL Replication概述 优点 异步复制&#xff08;Asynchronous repication&#xff09; 全同步复制&#xff08;Fully synchronous replication&#xff09; 半同步复制&#xff08;Semisynchronous replication&#xff09; 三、MySQL支持的复制 四、部署主从…

解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx_fc1‘

问题描述 训练模型时&#xff0c;分阶段训练&#xff0c;第二阶段加载第一阶段训练好的模型的参数&#xff0c;接着训练 第一阶段训练&#xff0c;含有代码 if (train_on_gpu):if torch.cuda.device_count() > 1:net nn.DataParallel(net)net net.to(device)第二阶段训练…

WIZnet W5100S-EVB-Pico DHCP 配置教程(三)

DHCP协议介绍 什么是DHCP&#xff1f; 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和配置。 DHCP于1993年10月成为标准协议&#xff0c;其前身是BOOTP协议。DHCP协议由…

【计算机网络】第 4 课 - 物理层

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、物理层的基本概念 2、物理层协议的主要任务 3、物理层任务 4、总结 1、物理层的基本概念 在计算机网络中&#xff0c;用来…

❤️创意网页:创意动态画布~缤纷移动涂鸦~图片彩色打码

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【C/C++】#include<xxx.h>和#include“xxx.h“

2023年7月29日&#xff0c;周六晚上 今天下午和晚上花了不少时间去研究这个C/C的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别&#xff0c;收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。 说实话&#xff0c;我挺想…