C++ 入门05:类和对象
往期回顾:
C++ 入门02:控制结构和循环-CSDN博客
C++ 入门03:函数与作用域-CSDN博客
C++ 入门04:数组与字符串-CSDN博客
一、前言
在前面文章的学习中,我们了解了 C++ 的基本结构、变量、输入输出、控制结构、循环、函数、作用域以及数组与字符串。今天,我们将深入学习面向对象编程(OOP)的核心概念:类和对象。这是编写复杂和模块化程序的重要基础。
二、类和对象
2.1、什么是类和对象
类是一个模板或蓝图,用于创建对象。对象是类的实例,具有类定义的属性和方法。通过类和对象,可以实现数据封装、继承和多态等面向对象编程的特性。
通过类和对象,可以实现数据封装、继承和多态等面向对象编程的特性。
(1)类的定义
类(Class)是面向对象编程(OOP)中的一个核心概念,它扮演着模板或蓝图的角色,用于定义一组具有共同属性和方法的对象的结构。这些属性和方法共同描述了对象的状态和行为,使得对象能够模拟现实世界中的实体或概念。通过类的定义,我们可以清晰地规划出对象将如何被创建、如何相互交互以及它们将如何响应不同的操作。
语法:
class ClassName {
public:// 公有成员属性和方法的声明private:// 私有成员属性和方法的声明
};
示例:
#include <iostream>
using namespace std;class Car {
public:string brand;string model;int year;void displayInfo() {cout << "Brand: " << brand << endl;cout << "Model: " << model << endl;cout << "Year: " << year << endl;}
};
(2)创建对象
对象是类的具体实例,是根据类的定义在内存中分配的一块区域,用于存储实际的数据值(即属性的具体值)和实现方法的功能。每个对象都是独特的,但它们都共享着类的结构,这意味着所有对象都具有相同的属性集合和方法集,但各自的属性值可以不同,从而体现出对象的个性化和差异性。
示例:
#include <iostream>
using namespace std;class Car {
public:string brand;string model;int year;void displayInfo() {cout << "Brand: " << brand << endl;cout << "Model: " << model << endl;cout << "Year: " << year << endl;}
};int main() {Car myCar; // 创建一个 Car 类的对象myCar.brand = "Toyota";myCar.model = "Corolla";myCar.year = 2020;myCar.displayInfo(); // 调用对象的成员函数return 0;
}
(3)类的构造函数和析构函数
类的构造函数(Constructor)和析构函数(Destructor)是面向对象编程中两个非常重要的特殊成员函数,它们在对象的生命周期中扮演着关键角色。
A、构造函数
构造函数是一种特殊的成员函数,其主要职责是在创建对象时初始化对象的成员变量。当使用new
关键字(在C++或类似语言中)或相应的语法(如Java、C#中的直接对象实例化)创建类的实例时,构造函数会自动被调用。构造函数没有返回类型,甚至连void
也不写,其名称必须与类名完全相同(包括大小写,如果语言对大小写敏感的话)。
特点与用途:
自动调用: | 对象被创建时自动调用,无需手动调用。 |
初始化成员变量: | 可以在构造函数中设置成员变量的初始值,确保对象在创建时处于有效状态。 |
构造函数的重载: | 一个类可以有多个构造函数,只要它们的参数列表不同(即参数的数量、类型或顺序不同),这样就可以根据不同的需要初始化对象。 |
默认构造函数: | 如果程序员没有为类定义任何构造函数,编译器会提供一个默认的构造函数,它不接受任何参数,并且不会为成员变量执行任何初始化操作(在C++中,如果类中有内置类型或指针成员,未初始化的成员变量会包含不确定的值,这可能导致未定义行为)。 |
语法:
class ClassName {
public:ClassName() {// 构造函数体}
};
示例:
#include <iostream>
using namespace std;class Car {
public:string brand;string model;int year;// 构造函数Car(string b, string m, int y) {brand = b;model = m;year = y;}void displayInfo() {cout << "Brand: " << brand << endl;cout << "Model: " << model << endl;cout << "Year: " << year << endl;}
};int main() {Car myCar("Toyota", "Corolla", 2020); // 使用带参数的构造函数创建对象myCar.displayInfo();return 0;
}
B、析构函数
析构函数是另一种特殊的成员函数,它在对象生命周期结束时自动调用,用于执行清理工作,如释放对象占用的资源(如动态分配的内存、文件句柄、网络连接等)。析构函数的名称是在类名前加上波浪线(~
)。与构造函数类似,析构函数也不接受任何参数,也不返回任何值。
特点与用途:
自动调用: | 对象被销毁时自动调用,无需手动调用。对象销毁的情况包括:程序结束、对象离开作用域(如函数返回时局部变量被销毁)、使用delete 操作符删除动态分配的对象(在C++中)。 |
清理资源: | 确保对象占用的所有资源都被正确释放,避免内存泄漏等问题。 |
只能有一个析构函数: | 每个类只能有一个析构函数,且析构函数不能被重载。 |
语法:
class ClassName {
public:~ClassName() {// 析构函数体}
};
示例:
#include <iostream>
using namespace std;class Car {
public:string brand;string model;int year;Car(string b, string m, int y) {brand = b;model = m;year = y;}~Car() {cout << "Destructor called for " << brand << " " << model << endl;}void displayInfo() {cout << "Brand: " << brand << endl;cout << "Model: " << model << endl;cout << "Year: " << year << endl;}
};int main() {Car myCar("Toyota", "Corolla", 2020);myCar.displayInfo();return 0;
}
(4)访问修饰符
访问修饰符是面向对象编程中用于控制类成员(包括成员变量和成员函数)访问权限的重要机制。它们定义了类内部的不同部分(如属性和方法)在何处以及如何被访问,从而实现了封装性,这是面向对象编程的四大支柱之一(封装、继承、多态、抽象)。C++ 作为一种广泛使用的面向对象编程语言,提供了三种基本的访问修饰符:public
、private
和 protected
。
A、public
- 定义:
public
访问修饰符允许类的成员从类的外部被访问。如果一个成员被声明为public
,那么它就可以被任何外部代码访问,无论是通过类的实例还是通过派生类(尽管对于派生类来说,还有其他因素需要考虑,如继承类型和访问权限)。 - 用途:
public
成员通常用于定义类的接口,即那些需要被类的用户或客户端代码直接访问的属性和方法。通过公共接口,类的用户可以在不直接操作类的内部实现细节的情况下,与类进行交互。
B、private
- 定义:
private
访问修饰符限制了类的成员只能在类的内部被访问。这意味着,除了类本身的方法之外,没有任何外部代码(包括派生类)可以直接访问这些成员。 - 用途:
private
成员通常用于封装类的内部实现细节,防止外部代码直接访问这些可能敏感或复杂的内部状态。这有助于保护类的完整性,并允许类的设计者在不破坏现有代码的情况下对类的内部实现进行修改或优化。
C、protected
- 定义:
protected
访问修饰符提供了一种介于public
和private
之间的访问级别。被声明为protected
的成员在类的内部(如同private
成员)以及任何派生类(子类)中都是可访问的,但它们不能被类的外部直接访问。 - 用途:
protected
成员主要用于在基类(父类)和派生类之间共享数据和方法,而又不希望这些数据和方法被类的外部直接访问。通过这种方式,基类可以为其派生类提供一些受保护的功能,同时保持这些功能的封装性。
示例:
#include <iostream>
using namespace std;class Car {
private:string brand;string model;public:int year;void setBrand(string b) {brand = b;}void setModel(string m) {model = m;}void displayInfo() {cout << "Brand: " << brand << endl;cout << "Model: " << model << endl;cout << "Year: " << year << endl;}
};int main() {Car myCar;myCar.setBrand("Toyota");myCar.setModel("Corolla");myCar.year = 2020;myCar.displayInfo();return 0;
}
以上就是 C++ 程序的类和对象的基本用法的知识点了。包括类的定义、对象的创建、构造函数和析构函数以及访问修饰符。类和对象是面向对象编程的核心概念,掌握它们可以帮助我们编写更模块化和可维护的代码。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
C++ 入门05:类和对象
往期回顾: C 入门02:控制结构和循环-CSDN博客C 入门03:函数与作用域-CSDN博客C 入门04:数组与字符串-CSDN博客 一、前言 在前面文章的学习中,我们了解了 C 的基本结构、变量、输入输出、控制结构、循环、函数、作用域…...
![](https://i-blog.csdnimg.cn/direct/960e97475609476a934f6b425040c75d.png)
4G LTE教程
整体架构 物理层(第 1 层) 物理层通过空中接口传输来自 MAC 传输信道的所有信息。负责 RRC 层的链路自适应 (AMC)、功率控制、小区搜索(用于初始同步和切换目的)和其他测量(LTE 系统内部和系统之间)。 介…...
![](https://i-blog.csdnimg.cn/direct/c50d4c849a8f4d5d9a0d821ab3d389de.png)
C++:哈希表
哈希表概念 哈希表可以简单理解为:把数据转化为数组的下标,然后用数组的下标对应的值来表示这个数据。如果我们想要搜索这个数据,直接计算出这个数据的下标,然后就可以直接访问数组对应的位置,所以可以用O(1)的复杂度…...
![](https://i-blog.csdnimg.cn/direct/e0c6ebf26fda484fbf7cb4b50f05b0ec.png)
自己动手写一个滑动验证码组件(后端为Spring Boot项目)
近期参加的项目,主管丢给我一个任务,说要支持滑动验证码。我身为50岁的软件攻城狮,当时正背着双手,好像一个受训的保安似的,中规中矩地参加每日站会,心想滑动验证码在今时今日已经是标配了,司空…...
![](https://www.ngui.cc/images/no-images.jpg)
keepalive脑裂
keepalive脑裂 调度器的高可用 vip地址主备之间的切换,主在工作时,p地址只在主上,主停止工作,ip飘移到备服务器。 在主备的优先级不变的情况下,主恢复工作,vip会飘回到主服务器。 1、配优先级 2、配置…...
![](https://i-blog.csdnimg.cn/direct/e9fcef18247e40c78c13d0ab880c7cbc.png#pic_center)
STM32Cubemx配置生成 Keil AC6支持代码
文章目录 一、前言二、AC 6配置2.1 ARM ComPiler 选择AC62.2 AC6 UTF-8的编译命令会报错 三、STM32Cubemx 配置3.1 找到stm32cubemx的模板位置3.2 替换文件内核文件3.3 修改 cmsis_os.c文件3.4 修改本地 四、编译对比 一、前言 使用keil ARM compiler V5的时候,编译…...
![](https://www.ngui.cc/images/no-images.jpg)
Perl基础入门指南:从零开始掌握Perl编程
Perl是一种功能强大且灵活的编程语言,广泛应用于系统管理、Web开发、网络编程和文本处理等领域。如果你是编程新手或者想学习一种新的编程语言,Perl是一个不错的选择。本文将带你了解Perl的基础知识,并通过简单的示例代码帮助你快速入门。 什…...
![](https://www.ngui.cc/images/no-images.jpg)
Mybatis SQL注解使用场景
MyBatis 提供了几种常用的注解,主要用于简化 XML 映射文件的编写,使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例: 1. Select Select 注解用于执行查询操作,并将查询结果映…...
![](https://i-blog.csdnimg.cn/direct/b6d8d2ef20ba428dbe66ad02b05f9c1d.png#pic_center)
Dataset for Stable Diffusion
1.Dataset for Stable Diffusion 笔记来源: 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github:pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集,该数据集有两个文件ÿ…...
![](https://img-blog.csdnimg.cn/6e6eedab00b6492e988e963ff638fd17.png)
近期matlab学习笔记,学习是一个记录,反复的过程
近期matlab学习笔记,学习是一个记录,反复的过程 matlab的mlx文件在运行的时候,不需要在文件夹路径下,也能运行,但是需要调用子函数时,就需要在文件所在路径下运行 那就先运行子函数,把路径换过来…...
![](https://www.ngui.cc/images/no-images.jpg)
Elasticsearch7.5.2 常用rest api与elasticsearch库
目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式:PUT 请求URL:http://ip/(your_index_nam…...
![](https://i-blog.csdnimg.cn/direct/8e10339dec044e04900ce56f326aa374.png)
Autosar Dcm配置-0x28服务ComControl-基于ETAS软件
文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…...
![](https://www.ngui.cc/images/no-images.jpg)
平安养老险厦门分公司:提升金融服务,发挥金融力量
为向社会公众普及金融保险知识,传递消费者权益保护理念,平安养老保险股份有限公司厦门分公司(以下简称“分公司”)积极开展“78保险公众宣传日”系列教育宣传活动。分公司紧扣“保险,让每一步前行更有底气”主题&#…...
![](https://i-blog.csdnimg.cn/direct/05872ccaee2d4c369525e791ac0722d8.png)
【开源合规】开源许可证风险场景详细解读
文章目录 前言关于BlackDuck许可证风险对比图弱互惠型许可证举个例子具体示例LGPL系列LGPL-2.0-onlyLGPL-2.0-or-laterLGPL-2.1-onlyLGPL-2.1-or-laterLGPL-3.0-onlyLGPL-3.0-or-laterMPL系列MPL-1.0MPL-1.1MPL-2.0EPL系列EPL-1.0EPL-2.0互惠型许可证GPL系列GPL-1.0GPL-2.0GPL-…...
![](https://i-blog.csdnimg.cn/direct/43b599adf9674143b879bf8524d41394.png)
Redis持久化RDB,AOF
目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门,安装,以及基础配置,多实例的实现:redis的安装看我上一篇: Redis安装部署与使用,多实例 redis是挡在MySQL前面的,运行在内存…...
![](https://i-blog.csdnimg.cn/direct/e900f0cf58ee4b7ca101399ce6e9f1d7.png)
【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】
一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox,和Vmware是一样的,只是box更轻量级 1)需要注意内存选择,4G 2、启动完成后,需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具,进…...
![](https://www.ngui.cc/images/no-images.jpg)
mvcc 速读
MVCC(Multi-Version Concurrency Control,多版本并发控制)是MySQL中一种用于实现数据库并发控制的方法,尤其在InnoDB存储引擎中得到了广泛应用。它的主要作用是提高数据库在高并发场景下的性能,并确保数据的一致性。 …...
![](https://img-blog.csdnimg.cn/50598b89cf3648d0b97471015e46892b.jpg)
美容仪维修过程记录
近期维修的家用射频美容仪,发一些维修过程的拆机图片...
![](https://i-blog.csdnimg.cn/direct/d680e547c21d4217b1f0f70561e18fc6.png#pic_center)
STM32入门开发操作记录(一)——新建工程
目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕,课程资…...
![](https://i-blog.csdnimg.cn/direct/2a3a566b24ec47ad89315736e0fa8914.png)
QT实现自定义带有提示信息的透明环形进度条
1. 概述 做界面开发的童鞋可能都会遇到这样的需求,就是有一些界面点击了之后比较耗时的操作,需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢,话不多说,上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…...
![](https://www.ngui.cc/images/no-images.jpg)
金币程序题
昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间…...
![](https://i-blog.csdnimg.cn/direct/0595404e0cad4f66a7cdbf0b95da5346.png)
《Windows API每日一练》9.13资源-鼠标位图和字符串
鼠标指针位图(Mouse Cursor Bitmap)是用于表示鼠标指针外观的图像。在 Windows 窗口编程中,可以使用自定义的鼠标指针位图来改变鼠标的外观,并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点: ●…...
![](https://i-blog.csdnimg.cn/direct/c43783402e424db38c03f78ac9b98978.png)
【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程
一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …...
![](https://www.ngui.cc/images/no-images.jpg)
thinkphp:数据库复合查询-OR的使用
完整代码 $data[info] db::table(po_headers_all)->alias(ph) //设置wip_jobs_all的别名->join([vendors > ve], ph.vendor_codeve.vendor_code)->field(ph.po_num,ph.status,ph.vendor_code,ve.vendor_name,ph.po_all_amount,ph.note,ph.order_date,ph.need_dat…...
![](https://www.ngui.cc/images/no-images.jpg)
网络安全那些梗
网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗: 关掉服务器是最有效的安全方法:这个梗源自一个笑话,讲述了一位程序员因误解妻子的话而只买了一个包子回家,随后被…...
![](https://img-blog.csdnimg.cn/img_convert/8eee276818d2b6d424044bb2f69e8ce3.jpeg)
交通气象站:保障道路安全的智慧之眼
随着社会的快速发展,交通运输日益繁忙,道路安全成为公众关注的焦点。在这个背景下,交通气象站作为保障道路安全的重要设施,正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息,也为广大驾驶员…...
![](https://i-blog.csdnimg.cn/direct/169a8a151b4a4ab4a1b5d67ec1cd3244.webp)
【分库】分库的核心原则
目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时,遵循一系列核心原则是至关重要的,以确保系统不仅能够在当前规模下高效运行,还能够随着…...
![](https://i-blog.csdnimg.cn/direct/c6c42278c28c45d6b7d82eb263d9fb20.png)
【Linux】软件管理工具 yum
文章目录 概念搜索:yum list安装:yum install卸载:yum remove 概念 在Linux下安装软件,可以下载到程序的源代码,进行编译得到可执行程序,另外这些软件还有依赖其它工具的问题,还得下载编译这些依…...
![](https://www.ngui.cc/images/no-images.jpg)
LangChain —— Prompt Templates
文章目录 一、什么是 Prompt Templates1、String PromptTemplates2、ChatPromptTemplates3、MessagesPlaceholder 留言占位符 二、如何使用 Prompt Templates1、使用几个简短示例2、在 chat model 中使用几个简短示例3、部分格式化提示模板4、一起编写提示 一、什么是 Prompt T…...
![](https://www.ngui.cc/images/no-images.jpg)
Python库 - Scrapy
Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据ÿ…...
![](/images/no-images.jpg)
企业视频网站模板/电商运营培训大概多少学费
1.开野方式三条路的线权都是短手英雄,英雄强度决定兵线情况都是长手英雄,由于法师需要控蓝,AD强度更高卡莎和猫咪在前期的推线能力不强,对面派克前压,卡莎就A不了兵三条路的作战能力gank成功率刷野速度...
![](https://img-blog.csdnimg.cn/img_convert/f82d3a138cc22a7339ec0e3968e1fa54.png)
草莓网是b2b吗/搜索引擎优化怎么做的
考虑这个y(x)函数:我们可以在文件中生成这些分散的点:dataset_1D.dat:# x y0 01 12 03 -94 -32以下是这些点的一维插值代码:加载这些分散的点创建x_mesh执行1D插值代码:^{pr2}$图中显示了以下内容:现在&…...
![](/images/no-images.jpg)
wordpress ftp 上传到 那个文件夹/冬镜seo
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容。其中关于 Controller 的约定是这样的。 每个 Controller 类的名字以 Controller 结尾,并且放置在 Controllers 目录中。Controller 使用的视图是在 Views 主目录的一个子目录中…...
![](https://images2015.cnblogs.com/blog/880812/201606/880812-20160616095128760-419292071.png)
wordpress置顶文章/上海谷歌优化
情况一:ng-click 和ng-if 一起使用 情况二:AngularJS中动态添加的ng-click 失效 正常情况(即非动态插入 DOM 对象)下,ng-click 这样的指令之所以有效(即点击之后能调用注册在可见作用域里的方法)…...
![](https://img-blog.csdnimg.cn/20200914181205977.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1VidW50dVRvdWNo,size_16,color_FFFFFF,t_70)
北京最新疫情情况/seo赚钱方法大揭秘
在我们实际使用 Elasticsearch 时,随着时间的推移,我们会发现有扩容的必要。这个可能由于我们在刚开始创建项目认识不足。我们需要更多的 primary shards,这样可以提高 ingest 的速度。那么我们有什么办法来把之前的一个大的索引变成更多的小…...
![](/images/no-images.jpg)
闵行区做网站/淘宝怎么设置关键词搜索
一.Core标签库 • 核心标签库主要包括通用标签、条件标签、迭代标签和与URL相关的标签。 • 在使用Core标签库的JSP文件的开始部分,添加代码: <%taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"…...