【自用23.】C++-const数据成员及const成员函数

news2024/9/21 1:40:49

const数据成员

const数据成员的初始化方式:

  1. 使用类内值(C++11支持)
  2. 使用构造函数的初始化列表

(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)

注意: 不能在构造函数或其他成员函数内,对const成员赋值!

代码:

Human.h

#pragma once

#include <string>

using namespace std;

extern int HumanCount;

class Human {
public:
	Human();
	Human(int age, int salary, string bldType);

	int getAge();
	Human* compare1(Human* other);
	static int gethumanCount();
	void description();

private:
	string name = "Unknown";
	int age = 28;
	int salary;
	char* addr;
	const string bloodType;
	//const string bloodType = "A";//仅C++11支持类内初始化
	
	static int humanCount;
};

Human.cpp

#include "Human.h"
#include <iostream>

using namespace std;

int HumanCount = 0;

int Human::humanCount = 0;

//初始化列表
Human::Human():bloodType("未知") {
	name = "无名氏";
	age = 18;
	salary = 30000;
	HumanCount++;
	humanCount++;
}

Human::Human(int age, int salary, string bldType):bloodType(bldType) {
	cout << "调用自定义的构造函数" << endl;
	this->age = age;      //this是一个特殊的指针,指向这个对象本身
	this->salary = salary;
	name = "无名";

	addr = new char[64];
	strcpy_s(addr, 64, "China");
	HumanCount++;
	humanCount++;
}

int Human::getAge() {
	return age;
}

int Human::gethumanCount() {
	return humanCount;
}

void Human::description() {
	cout << "age:" << age << " salary:" << salary << " bloodType:" << bloodType << endl;
}

Human* Human::compare1(Human* other) {
	if (age > other->age) {
		return  this; //没有创建新的对象
	}
	else {
		return other;
	}
}

main.cpp

#include <iostream>
#include <Windows.h>

#include <string.h>
#include "Human.h"

using namespace std;

void test0() {
	Human temp1;
	Human temp2;
}

int main(void) {
	Human h1;
	Human h2(18, 8000, "B");

	h1.description();
	h2.description();

	system("pause");
	return 0;
}

使用结果如下

 使用步骤如下:

在类定义中定义一个const常量,其中C++11版本可以满足类内初始化的需求,为了兼容更多版本,我们可以使用其他初始化方法。

在手动定义的默认构造函数中,在初始化列表中对这个常量进行初始化,如下

Human::Human():bloodType("未知") {

同时也要在自定义的构造函数中,在初始化列表中对常量进行初始化

Human::Human(int age, int salary, string bldType):bloodType(bldType) {

 const成员函数

需求分析:

const的Human对象,不能调用普通的成员函数。

分析:

C++认为,const(常量)对象,如果允许去调用普通的成员函数,而这个成员函数内部可能会修改这个对象的数据成员!而这讲导致const对象不再是const对象!

解决方案:

如果一个成员函数内部,不会修改任何数据成员,就把它定义为const成员函数。

代码如下

Human.h

#pragma once

#include <string>

using namespace std;

extern int HumanCount;

class Human {
public:
	Human();
	Human(int age, int salary, string bldType);

	int getAge();
	Human* compare1(Human* other);
	static int gethumanCount();
	void description() const;

private:
	string name = "Unknown";
	int age = 28;
	int salary;
	char* addr;
	const string bloodType;
	//const string bloodType = "A";//仅C++11支持类内初始化
	
	static int humanCount;
};

 Human.cpp

#include "Human.h"
#include <iostream>

using namespace std;

int HumanCount = 0;

int Human::humanCount = 0;

//初始化列表
Human::Human():bloodType("未知") {
	name = "无名氏";
	age = 18;
	salary = 30000;
	HumanCount++;
	humanCount++;
}

Human::Human(int age, int salary, string bldType):bloodType(bldType) {
	cout << "调用自定义的构造函数" << endl;
	this->age = age;      //this是一个特殊的指针,指向这个对象本身
	this->salary = salary;
	name = "无名";

	addr = new char[64];
	strcpy_s(addr, 64, "China");
	HumanCount++;
	humanCount++;
}

int Human::getAge() {
	return age;
}

int Human::gethumanCount() {
	return humanCount;
}

void Human::description() const {
	cout << "age:" << age << " salary:" << salary << " bloodType:" << bloodType << endl;
}

Human* Human::compare1(Human* other) {
	if (age > other->age) {
		return  this; //没有创建新的对象
	}
	else {
		return other;
	}
}

main.cpp

#include <iostream>
#include <Windows.h>

#include <string.h>
#include "Human.h"

using namespace std;

void test0() {
	Human temp1;
	Human temp2;
}

int main(void) {
	const Human h1;
	Human h2(18, 8000, "B");

	h1.description();
	h2.description();

	system("pause");
	return 0;
}

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

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

相关文章

全新的训练算法:Reflection 70B进入大众的视野

在2024年9月6日&#xff0c;大模型的圈子迎来了一位新成员——Reflection 70B&#xff0c;它横扫了MMLU、MATH、IFEval、GSM8K等知名的模型基准测试&#xff0c;完美超越了GPT-4o&#xff0c;同时也超越了Claude3.5 Sonnet成为了新的大模型之王&#xff0c;Reflection 70B到底是…

Linux: network: esp:收到了重复的包

最近遇到一个问题,是说收到了dup的ESP包。 这个目前还是未解的谜题,不知道到底是谁发的重复包。 但是从wireshark里确实可以看到在相同SPI下,收到了两个序号相同的ESP包。 这个时候,就会触发防火墙的防御机制。下面是一个大模型给出的一个解答(主要介绍的是anti-replay的…

10款企业图纸加密软件大盘点|2024企业图纸加密软件推荐

在数字化时代&#xff0c;企业图纸数据的安全性显得尤为重要。图纸数据往往包含企业的核心技术、设计方案和知识产权&#xff0c;一旦泄露&#xff0c;将对企业造成不可估量的损失。因此&#xff0c;选择一款合适的图纸加密软件&#xff0c;成为企业保护核心资产的重要手段。以…

ComsolMatlab 互阻抗法计算多孔材料吸声(背腔无反射)

互阻抗法是一种用于计算多孔材料吸声性能的方法。它基于材料的声学参数来预测其吸声特性。互阻抗法的基本原理是考虑多孔材料中孔隙和固体相之间的相互作用&#xff0c;通过定义互阻抗来描述声波在材料中传播时的复杂情况。 在互阻抗法中&#xff0c;孔隙和固体相的声波反射和透…

第十五节:学习Springboot 的响应结果封装(自学Spring boot 3.x的第四天)

这节记录下如何使用枚举类和响应封装类实现响应结果封装。 第一步&#xff1a;新建立一个枚举类。枚举类的要求有两个变量&#xff0c;响应码code&#xff0c;响应信息desc。响应码需要跟前端约定好。 public enum ResponseCode {SUCCESS("success",101),ERROR(&qu…

2024年好用的10款图纸加密软件排行榜|图纸加密的最佳选择

随着企业对知识产权和数据安全需求的日益增加&#xff0c;图纸加密软件已经成为各行业保护敏感设计文档的关键工具。2024年&#xff0c;市场上涌现了多款优质的图纸加密软件&#xff0c;帮助企业有效防范数据泄露、维护信息安全。本文将为您介绍2024年好用的10款图纸加密软件&a…

入驻国际数字影像产业园有哪些优势?

在数字文创产业蓬勃发展的今天&#xff0c;选择入驻国际数字影像产业园&#xff0c;意味着您已踏上了一条通往行业前沿的快车道。这里&#xff0c;不仅是数字影像产业的聚集地&#xff0c;更是创新与梦想的孵化器。那么&#xff0c;入驻国际数字影像产业园究竟有哪些优势呢&…

vmware虚拟机 windows下查看进程id(pid)

在日常运维过程中, 发现宿主机cpu占用高, 经常要看是那一个虚拟机占用内存或cpu高. 但是在windows资源管理器中,所有的虚拟机都显示的是vmware-vmx.exe. 目前手动情况下就需要一个挨着一个去看. 有没有直接查看虚拟机进程id虚拟机运行目录的方法?? 实现步骤 1. 通过 vm…

【Python进阶】一篇文章教你如何使用PyCharm的调试功能?

要使用 PyCharm 的调试功能&#xff0c;可以按照以下步骤进行操作&#xff1a; 1、打开 PyCharm 启动 PyCharm&#xff0c;并打开你的 Python 项目。 2、设置断点 在你想要调试的代码行上&#xff0c;点击行号左侧的空白处&#xff0c;或者使用快捷键 Ctrl F8。这将在该行…

【C++ 高频面试题】指针和引用、关于内存泄漏和野指针问题

文章目录 1. 静态变量、全局变量、局部变量2. 指针和引用的区别3. 内存泄漏4. 野指针 1. 静态变量、全局变量、局部变量 ①局部变量&#xff1a; 作用范围&#xff1a;局部变量只在定义它的函数或代码块内有效&#xff0c;函数执行结束后&#xff0c;局部变量即失效。 生命周…

点亮第一盏LED灯,认识stm32最小系统板

嵌入式初学者&#xff0c;直接上手stm32开发&#xff0c;首先就是买块stm32开发板&#xff0c;选择最基础的系列&#xff0c;F103C8t6&#xff0c;先不管里面的数字代表什么意思&#xff0c;先弄明白F103代表什么意思&#xff0c;F103表示F1系列里的03子系列&#xff0c;OK&…

Http中get与post的区别,99%的人都理解错了吧

Get和Post是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是Get把参数包含在URL中&#xff0c;Post通过request body传递参数。 你可能自己写过无数个Get和Post请求&#xff0c;或者已经看过很多权威网站总结…

ICMAN触摸感应芯片方案

ICMAN触摸感应芯片 ICMAN触摸感应芯片采用先进的电容感应技术&#xff0c;能够精确检测和识别触摸动作。这一技术通过感应人体与传感器之间的微小电容变化来实现触控功能。相比传统的电阻式触控技术&#xff0c;电容感应技术具有更高的灵敏度和响应速度&#xff0c;能够提供更…

智能交通(四)——CMC特刊推荐

特刊征稿 01 期刊名称&#xff1a; Advanced Trends in Vehicular Ad hoc Networks (VANETs) 截止时间&#xff1a; 提交截止日期:2025年5月31日 目标及范围&#xff1a; 涵盖但不限于以下关键领域的提交&#xff1a; - 下一代 V2X 通信&#xff1a; 本主题探讨了如何将…

预防式编程——避免空值

文章目录 1. 输入验证2. 使用可选类型&#xff08;Optional Types&#xff09;3. 非空断言4. 安全调用运算符5. 提供默认值6. 设计模式7. 文档说明8. 数据结构的选择9. 逻辑判断10. 构造函数和初始化11. 使用工具类12. 枚举类型13. 编码规范14. 测试15. 重构16. 教育与培训 案例…

【js】将串口数据翻译为字符串-含源码

一、背景 通过串口工具获取到的以十六进制表示的字符串数据&#xff0c;按照ascii码转换为字符串。 二、分析 输入应为十六进制的以单个字节为单位的字节与字节之间以空格间隔的字符串。 输出应为完整连续的字符串。 三、实现 3.1按照空格拆解输入字符串为字符数组 var i…

vscode 高效率开发手册

vscode 高效率开发手册 2023.11.17 colin v1.0 文章目录 vscode 高效率开发手册一、统一代码风格二、自定义代码片段三、熟记`vscode`快捷键四、一些有用的系统设置1、焦点变更自动保存2、删除文件中的每行末尾的空格五、一些有用的、高效率插件安装方式:1、自行联网安装;2、…

原生 input 中的 “type=file“ 上传文件

目标&#xff1a;实现文件上传功能 原型图&#xff1a; HTML部分&#xff1a; <div class"invoice-item"><div class"invoice-title">增值税专用发票</div><div class"invoice-box"><el-form-item label"标准…

信息化和精益化应当先做哪个?天行健王春城老师回答你

随着科技的飞速发展&#xff0c;企业面临着来自内部和外部的双重压力。在这样的背景下&#xff0c;信息化和精益化成为了企业提升竞争力的两个重要方向。那么&#xff0c;面对这两个重要的战略方向&#xff0c;企业应该先从哪里入手呢&#xff1f;下面天行健王春城老师就此展开…

(九)Mysql之 【MySQL MHA】

前置资源 一、什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的…