C++5-explicit、const的用法、mutable、常成员函数构成重载、在主函数中修改m_i的值

news/2024/4/27 20:43:30/文章来源:https://blog.csdn.net/kyrie_sakura/article/details/127354929

一、explicit的使用

explicit作用:

明确确定构造函数只能构造对象

代码示例:

class A
{
public:A(int i = 0):m_i(i){cout<<"A"<<i<<endl;}//构造函数可以用作类型转换,将int转换成类对象//explicit A(int i = 0):m_i(i){cout<<"A"<<i<<endl;}//explicit,明确确定构造函数只能构造对象void print(){cout<<m_i<<endl;}
private:int m_i;
};void main()
{A c();     //为声明函数c,无参,返回值类型为AA d;       //定义无参对象,如果要定义无参对象,那么一定不能带()A a(5);    //为正常的调用//相当于用7去初始化b,被编译器优化了,编译器会声明一个无名对象//因此构造函数可以用作类型转换//加了explicit,就不能通过,会报错,可以避免这种现实的表达式出现A b = 7;a.print();b.print();
}

运行结果:

在这里插入图片描述

加了explicit后,运行 A b = 7; 会报错:

在这里插入图片描述

二、const的用法

const 作用
在C中是只读,在C++中是常量

1、const 可以定义常量

例如:const int a=10;

//注意,必须在声明的时候初始化
在这里插入图片描述

2、const 可以定义指针

可以定义不同的对象:
指针本身
指针所指向的内容

void main()
{int a=10;const int *p1 = &a; //p1本身是指针变量,所指向的内容不能修改,//注意a本身是能改的,可以通过改变a的值去改变*p1的值;但*p1不能,不能通过*p1去改变a的值。int const *p2 = &a; //同上int *const p3 = &a; //const 修饰p3本身。可以通过*p3改变a的值;p3本身是常量,不能改变。const int *const p4 = &a; //p4本身和所指向内容都不能修改/*cout<<*p1<<endl;a = 20;cout<<*p1<<endl;//(*p1)++;p1++;p2++;*/*p3 = 20;//p3 =&b;//要修饰p3本身cout<<a<<endl;
}

3、const 可以修饰函数的形参 – 提高函数的可读性和健壮性

例如:strcmp、strcpy
在这里插入图片描述

int strcmp(const char *str1,const char *str2)  //字符串比较
//字符串比较,不能对值进行修改
char *strcpy(char *dest,const char *src)      //执行字符串的拷贝
//可以通过const的使用,一眼看出是将*str2内的内容拷贝到*str1内//dest本身就表示目的字符串,src表示原字符串

相关笔试题:

char *strcpy(char *dest,const char *src)

题目为:第一个dest代表的是目的字符串的首地址,为什么还需要函数返回值(返回值是目的字符串的首地址)
为什么不是

void mystrcpy(char *dest,const char *src);

答:实习链式表达式,什么意思呢:将这个函数的整体作为另外一个函数的参数去实现,又或是可以将其实现为表达式的右值;
例如:

cout<<strlen(strcpy(p,"123456"))<<endl;//否则为
strcpy(p,"123456");
strlen(p);

4、cosnt可以修饰成员函数 — 放在函数参数的外面 — 常成员函数 — 在当前函数中不能修改本类数据成员的值

例如:

class A
{
public:void get()const{}
private:
}

一般情况下将 get函数、打印函数等这类函数设置为const

示例代码:

class A
{
public:A(int i = 0,int j = 0):m_i(i),m_j(j){}void Print(){cout<<m_i<<" "<<m_j<<endl;}//只是想要获取m_i的值,不能去修改int GetI()const //称其为常成员函数(什么意思呢:在当前函数中不能修改本类数据成员的值,即为在当前函数中不能修改m_i和m_j){//m_i = 10;//error,在此函数(GetI)中不能修改return m_i;}int GetJ()const //{return m_j;//常成员函数}
private:int m_i;int m_j;
};
void main()
{A a(4,7);//cout<<a.m_i<<a.m_j<<endl;//error,m_i和m_j是private私有的//假设只想输出m_i(一般情况下实现打印函数,会将成员都打印)cout<<"a.m_i = "<<a.GetI()<<endl;//可行}

运行结果:
在这里插入图片描述

三、mutable

使得其定义的类成员,可以在常成员函数内进行修改

class A
{
public:A(int i = 0,int j = 0):m_i(i),m_j(j){}void Print()const{m_i = 100;cout<<m_i<<" "<<m_j<<endl;}
private:mutable int m_i;int m_j;
};
void main()
{A a(4,7);a.Print();
}

运行结果:

在这里插入图片描述

4、常成员函数构成重载

示例代码:

class A
{
public:A(){}void fn()const{cout<<"fn const"<<endl;}void fn(){cout<<"fn"<<endl;}
};
void main()
{const A a;A b;a.fn();b.fn();
}

运行结果:
在这里插入图片描述

5、如何在主函数中修改m_i的值

思路:返回引用

	int& GetI_1()  //返回的是m_i本身{return m_i;}const int& GetI_2(){return m_i;}

示例代码:

class A
{
public:A(int i = 0):m_i(i){}void Print(){cout<<"m_i = "<<m_i<<endl;}/*int GetI(){return m_i;}*/int& GetI_1()  //返回的是m_i本身{return m_i;}const int& GetI_2()  //加了const后就不能进行修改,只能获取m_i的值{return m_i;}
private:int m_i;
};
//思考--想在主函数中修改m_i的值
void main()
{A a(6);a.Print();//a.m_i = 7;//error//a.GetI() = 7;cout<<"修改"<<endl;a.GetI_1() = 7;a.Print();//a.GetI_2() = 8;//error,加了const后就不能进行修改,只能获取m_i的值cout<<a.GetI_2()<<endl;
}

运行结果:

在这里插入图片描述

加了const后就不能进行修改,只能获取m_i的值

a.GetI_2() = 8;//error

在这里插入图片描述

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

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

相关文章

网络原理 --- 传输层Ⅰ UDP协议

文章目录网络原理传输层UDP 协议总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层 传输层主要负责端到端之间的传输,重点关注的是起点和终点 核心的协议有两个: UDP: 无连接 ,不可靠传输,面向数据报,全双工TCP : 有连接,可…

1024程序员节来了,

在中国“硅谷”西三旗&#xff0c;高精尖人才聚集地&#xff0c;一个砖头扔下来&#xff0c;砸中的10个人中&#xff0c;有7个是程序员 如今&#xff0c;程序员已发展成社会的主流职业&#xff0c;有多主流呢&#xff1f; 街头的王大妈李大爷都在讨论&#xff1a; “我儿子程…

vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板(vite+vue3+ts+qiankun项目)

前言 以下操作&#xff0c;是续接之前 第四步 ——即&#xff1a;vitevue3tspiniaelement-plus项目已完成搭建好&#xff0c;可以直接业务开发了 主应用技术栈&#xff1a;vue2webpackjs 集成qiankun(微前端) 1、安装vite-plugin-qiankun npm install vite-plugin-qiankun2、…

在Eclipse 中使用 Maven 创建雅加达 EE 应用程序

在本教程中&#xff0c;我将指导大家如何在 Eclipse 中创建新的雅加达 EE 应用程序支持 Maven。 首先&#xff0c;在 Eclipse 中&#xff0c;转到“文件”&#xff0c;选择“新建”&#xff0c;然后选择“Maven 项目”&#xff1a; 要使用 Maven 创建雅加达 EE 项目&#xff0…

操作系统闲谈01——IO多路复用

IO多路复用 同步异步IO问题 select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读…

贴片电阻的读数方法

贴片电阻图 今天讲一下贴片电阻的阻值、精度与贴片电阻丝印之间细微的关系。 大家经常见到的贴片电阻上的丝印有纯数字、数字与R组合、数字与除R之外的字母组合的&#xff0c;但大家知不知道这样的标注与贴片电阻的i精度相关&#xff1f;同一个阻值因为精度不同&#xff0c;标…

【Git】Git基本配置和常用命令

&#x1f4ad;&#x1f4ad; ✨&#xff1a; git基本配置和命令   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;&#xff1a;学习的过程就是不断接触错误&#xff0c;不断提升自己&#xff0c;冲鸭&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不…

从前端到全栈

你会学到什么&#xff1f; 掌握 Node.js 开发必备基础知识&#xff1b;理解 HTTP 协议核心原理与实践&#xff1b;基于 Node.js 实现自己的工程脚手架;从 0 打造在线绘图 Web 应用。 作者介绍 月影&#xff0c;字节跳动 ByteTech 负责人&#xff0c;资深 JavaScript 程序员&am…

GeoDetector --- 最优参数离散化

安装R包 (直接在RStudio安装GD包) install.packages("GD")加载数据 library(GD) #加载GD包 setwd("X:\\work\\GD") #设置工作路径 data1<-read.csv("data_raw.csv") #读取数据(未经离散化处理的原始数据) head(data1) #可以查看数…

(附源码)计算机毕业设计SSM基于的英语学习网站的设计与实现

&#xff08;附源码&#xff09;计算机毕业设计SSM基于的英语学习网站的设计与实现 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

ZK集群搭建和Hadoop单机版及Java API简单操作

一、背景 作为软件界最为复杂度的软件代表&#xff0c;当时操作系统、数据库、中间件。而学习中间件&#xff0c;分布式系统&#xff0c;必然绕不开zookeepr、Hadoop的学习。以下做个人搭建zookeeper和Hadoop的搭建的简单记录。相关的代码操作放在github上。 二、搭建过程 1、…

Markdown使用方法

Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia、简书等。 基本语法…

【ffmpeg】YUV实践

【ffmpeg】YUV实践前言生成YUV使用摄像头采集到YUV数据从现有的视频文件中提取YUV数据播放YUV播放Y分量提取各分量参考资料个人简介 &#x1f4e6;个人主页&#xff1a;一二三o-0-O的博客 &#x1f3c6;技术方向&#xff1a;C/C客户端资深工程师&#xff08;直播音视频剪辑&…

Spring 6.0 要来了,太强了

Spring Framework 6.0 发布了首个 RC 版本。 发布公告写道&#xff0c;Spring Framework 6.0 作为重大更新&#xff0c;目前 RC1 要求使用 Java 17 或更高版本&#xff0c;并且已迁移到 Jakarta EE 9&#xff08;在 jakarta 命名空间中取代了以前基于 javax 的 EE API&#xff…

HTML零基础入门(上)

一、什么是HTML html是一门标记性语言 全称是超文本标记语言(Hyper Text Markup Language)&#xff0c;它是用来描述网页的一种语言。 HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup language)。 html只是用来制作网页的一种语言&#xff0c;由各种各样的标签…

Visual Code配置C/C++

1. 前言 VS Code和以前的Visual studio 开发环境不一样,只是代码编辑器,如果需要运行代码C/C++,需要额外安装编译器。在Linux环境下,一般系统自带了gcc编译器,但是windows环境没有,所以要额外安装编译器,选择MinGW。总体参考资料: C/C++ for Visual Studio Code2. MinG…

ZnCdTe/ZnS三元/Cu2MoS4荧光量子点/MoS2QDs二硫化钼量子点的制备

瑞禧小编这里给大家准备了ZnCdTe/ZnS三元/Cu2MoS4荧光量子点/MoS2QDs二硫化钼量子点的制备步骤与方法&#xff0c;一起来学习吧&#xff01; MoS2QDs二硫化钼量子点的制备 以钼酸钠提供钼源,谷胱甘肽提供硫源,通过"自下而上"一步水热法制备MoS2 QDs,并以其荧光强度作…

Oracle——行转列与列转行

文章目录行转列创建表和增加测试数据方式一&#xff1a;先分组&#xff0c;再统计平铺方式二&#xff1a;使用Oracle11g自带函数PIVOT实现列转行创建表和增加测试数据方式一&#xff1a;union all 单个合并方式二&#xff1a;unpivot 函数实现总结资料参考行转列 把某一个字段…

Js中六种拖拽(拉)事件(drag 和 drop)

拖拽事件 今天同事问有没有实现过表格的拖拽功能&#xff0c;我当时想的是应该跟图片的拖拽代码逻辑是一样的主要是使用了浏览器中的以下几个事件 例如&#xff1a; 一、dragstart 二、dragend 三、dragover 四、dragenter 五、drop 等 文章目录拖拽事件前言(各个浏览器的兼容性…

基于matlab的神经网络设计,深度神经网络代码matlab

为什么谈论深度学习工具时&#xff0c;很少有人讨论matlab的神经网络工具包 首先深度学习不光是在学术界非常火热, 在工业界也有着大量的运用, 这就要求深度学习框架要方便在服务器上部署, 而这个恰恰是Matlab的软肋, 想象一下你前端用个Django做个页面接受用户输入的图像, 后…