C++:常函数

news2024/11/25 8:15:41

在C++中,常函数(const member functions)是指在类的成员函数声明和定义中使用 const 关键字修饰的函数。常函数的存在主要是为了在类的实例上提供一种保证:该函数不会修改类的成员变量。

在类的成员函数声明中,如果函数不会修改类的成员变量,可以将其声明为常函数。

常函数的格式
void myFunction() const{
        //函数体
};

在这个示例中,myFunction() 被声明为常函数,表示它不会修改任何类的成员变量。在函数体中,可以访问类的成员变量,但不能修改它们。否则编译器会报错。常函数主要用于表示对类的只读操作,从而提供了一种保证,使得编译器可以在调用时进行更严格的类型检查。常函数可以在常对象上调用,这样就可以确保常对象的成员变量不会被修改。

示例:
class RolePlayer {
public:
    //构造函数(带初始化列表)
    RolePlayer(int HP) : m_nHP(HP){};
        
    //深拷贝
    void SetName(char * m_NPCName) {
    this->m_NPCName = new char[strlen(m_NPCName) + 1];
    memset(this->m_NPCName,0, strlen(m_NPCName) + 1);
    strcpy(this->m_NPCName, m_NPCName);
    }
        
    //常函数
    void printInfo() const{
        std::cout << "Role HP:" << m_nHP << std::endl;
        std::cout << "Role Name:" << m_NPCName << std::endl;
    }
    
private:
    char * m_NPCName = nullptr;
    int m_nHP = 0;   
}

printInfo() 函数被声明为常函数,并在其中打印了角色玩家的信息。即使我们尝试在常对象上调用 printInfo() 函数,编译器也会保证该函数不会修改任何成员变量。

(关于深拷贝以及构造函数如果不清楚可以查看我之前的文章)

在主程序中调用
int main() {
    RolePlayer roleA(400);
    char szName[] = "Wolven";
    roleA.SetName(szName);
    roleA.printInfo();
    system("pause");
    return 0;
}

最后结果:

在示例中创建了一个 RolePlayer 对象 roleA,并通过构造函数传入了参数 400,接着,使用 SetName 方法将名字设置为 "Wolven"。然后,调用了 printInfo 方法,打印了角色玩家的信息。由于 printInfo 方法被声明为常函数,它不会修改任何成员变量,因此可以在常对象上安全地调用它,而编译器会确保这一点。

假如这个时候在常函数中添加了修改成员变量的内容,那么程序就报错:

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

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

相关文章

2024年CMS市场的份额趋势和使用统计

目前市面上有超过一半的网站都是使用CMS来搭建的&#xff0c;据不完全统计&#xff0c;现在大概有900多种CDM可供选择&#xff0c;以下是最常见的CMS的市场份额和使用率信息&#xff1a; 除了WordPress以外&#xff0c;Shopify和Wix也是比较流行的内容管理系统&#xff0c;尤其…

面试集中营—ElasticSearch架构篇

一、为什么用ElasticSearch&#xff1f; 1、支持多种数据类型。它可以处理非结构化、数值和地理信息等多种类型的数据&#xff1b; 2、简单的RESTful API。ES提供了一个简单易用的RESTful API&#xff0c;使得它可以从任何编程语言中调用&#xff0c;降低了学习的曲线。 3、近实…

HUST华科校园网自动登录

HUST校园网开机自动登录&#xff0c;后台保活 校园网虽然有无感认证&#xff0c;但是每次还得弹出网页&#xff0c;再点击一次连接&#xff0c;还是挺麻烦的。而且对于一部分开机自启的联网app来说&#xff0c;每次开机后无网络可能导致某些应用功能出bug或者其他异常行为。因此…

笃行致远,“易”往无前 | 易保全成立10周年啦

日月其迈&#xff0c;岁律更新。2024年4月28日&#xff0c;易保全迎来了10周岁生日。10年磨一剑&#xff0c;易保全创立至今&#xff0c;始终坚定自己的初心和使命&#xff0c;在时代的激流勇进中&#xff0c;以电子数据保全机构的身份与中国区块链共成长。 “创”说十年&…

Blender常见操作

1.局部视图&#xff1a;Local View&#xff0c;也可称作Solo模式&#xff0c;按快捷键 “/”进入&#xff0c;在按退出&#xff0c;只显示选中的物体&#xff08;可多选&#xff09;&#xff0c;方便编辑 2.物体合并&#xff1a;Ctrl J 其中&#xff0c;当选中多个物体时&am…

CSS border边框(理解网页边框制作)

目录 一、border边框介绍 1.概念 2.特点 3.功能 4.应用 二、border边框用法 1.border边框属性 2.边框样式 3.边框宽度 4.边框颜色 5.边框-单独设置各边 6.边框-简写属性 三、border边框属性 四、border边框实例 1.创建带有阴影效果的边框&#xff1a; 2. 创建一个类似标…

如何使用SOCKS5代理?

SOCKS5 是一个代理协议&#xff0c;在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。那么&#xff0c;SOCKS5代理该如何使用呢&#xff1f; 首先需要获取…

Aiseesoft Blu-ray Player for Mac:蓝光播放器

Aiseesoft Blu-ray Player for Mac是一款功能强大且易于使用的蓝光播放器&#xff0c;专为Mac用户打造。它以其卓越的性能和简洁的操作界面&#xff0c;为用户带来了全新的高清蓝光播放体验。 Aiseesoft Blu-ray Player for Mac v6.6.50激活版下载 这款软件支持播放任何高质量的…

2024年4月中国数据库排行榜:OceanBase再度登顶,KingBase稳步上升进前五

春风劲吹&#xff0c;迎来了2024年4月中国流行度排行榜。纵观本月榜单&#xff0c;各家数据库产品你追我赶&#xff0c;名次呈现微妙变动&#xff0c;它们正以不可忽视的力量&#xff0c;推动着中国乃至全球的数据管理革新。在这春意盎然的四月&#xff0c;让我们继续关注这些数…

命令执行。

命令执行 在该项目的readme中&#xff0c;描述了怎么去调用的flink 通过java原生的runtime来调用flink&#xff0c;下一步就是去看看具体的调用过程了&#xff0c;是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…

【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能

此篇文档记录通过 Flash 下载工具 完成 Flash 加密 功能的实现&#xff0c;此文档不启用 Flash 加密方案的 NVS 加密。 Flash 加密启动的验证代码&#xff1a;esp-idf/components/bootloader_support/src/flash_encrypt.c Flash 加密测试例程&#xff1a;esp-idf/examples/sec…

Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能

往期回顾 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍-CSDN博客 Qt绘图与图形视图之场景、视图架构的简单介绍-CSDN博客 Qt绘图与图形视图之基本图元绘制的简单介绍-CSDN博客 Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能 一、最终效果 实现对自定义图…

Agent AI智能体在未来,一定与你我密不可分

随着Agent AI智能体的逐渐成熟&#xff0c;人工智能应用的不断深入与拓展&#xff0c;相信在不久的将来&#xff0c;他与你我的生活一定是密不可分的。 目录 ​编辑 1 Agent AI智能体是什么&#xff1f; 2 Agent AI在语言处理方面的能力 2.1 情感分析示例 2.2 文本分类任…

Tetra Pak利乐中试工厂仿真 - 工艺开发、配方开发和无菌灌装的试验

此模型是基于速率的模型&#xff0c;使用Rate模块库中的离散速率模块和Item模块库中的离散事件模块。速率模块库位于ExtendSim Pro中。 利乐中试工厂&#xff08;得克萨斯州丹顿&#xff09;进行工艺开发、配方开发和无菌灌装的试验。它还对新的加工和灌装设备进行内部测试。该…

Colab用例与Gemma快速上手指南:如何在Colab和Kaggle上有效地运用Gemma模型进行机器学习任务

&#x1f42f; Colab用例与Gemma快速上手指南 &#x1f680; 文章目录 &#x1f42f; Colab用例与Gemma快速上手指南 &#x1f680;摘要引言正文&#x1f4dd; **基础使用&#xff1a;Gemma快速上手**环境设置和模型加载安装必要的库加载Gemma模型 推理示例 &#x1f6e0; **Ge…

秋招后端开发面试题 - Java语言基础(上)

目录 Java基础上前言面试题Java 语言的特点JVM JDK JRE什么是跨平台性&#xff1f;原理是什么&#xff1f;什么是字节码?采用字节码的好处是什么?Java 和 C 的区别&#xff1f;注释&#xff1f;关键字关键字 instanceof类型转换关键字 this 和 super关键字 final finally fin…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

纯js对比excel小工具

如何使用JavaScript和xlsx.js实现Excel文件对比&#xff1a;实战指南 在日常办公或数据分析工作中&#xff0c;我们经常需要比较两个Excel文件中的数据差异。手动对比不仅耗时费力&#xff0c;还容易出错。本文将带你通过一个简单的网页应用&#xff0c;利用JavaScript和开源库…

Spring AI聊天功能开发

一、引入依赖 继承父版本的springboot依赖&#xff0c;最好是比较新的依赖。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePat…

transformer上手(10)—— 文本摘要任务

文本摘要是一个 Seq2Seq 任务&#xff0c;尽可能保留文本语义的情况下将长文本压缩为短文本。 文本摘要可以看作是将长文本“翻译”为捕获关键信息的短文本&#xff0c;因此大部分文本摘要模型同样采用 Encoder-Decoder 框架。当然&#xff0c;也有一些非 Encoder-Decoder 框架…