当前位置: 首页 > news >正文

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++ 作为一种广泛使用的面向对象编程语言,提供了三种基本的访问修饰符:publicprivate 和 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++ 程序的类和对象的基本用法的知识点了。包括类的定义、对象的创建、构造函数和析构函数以及访问修饰符。类和对象是面向对象编程的核心概念,掌握它们可以帮助我们编写更模块化和可维护的代码。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

相关文章:

C++ 入门05:类和对象

往期回顾&#xff1a; C 入门02&#xff1a;控制结构和循环-CSDN博客C 入门03&#xff1a;函数与作用域-CSDN博客C 入门04&#xff1a;数组与字符串-CSDN博客 一、前言 在前面文章的学习中&#xff0c;我们了解了 C 的基本结构、变量、输入输出、控制结构、循环、函数、作用域…...

4G LTE教程

整体架构 物理层&#xff08;第 1 层&#xff09; 物理层通过空中接口传输来自 MAC 传输信道的所有信息。负责 RRC 层的链路自适应 (AMC)、功率控制、小区搜索&#xff08;用于初始同步和切换目的&#xff09;和其他测量&#xff08;LTE 系统内部和系统之间&#xff09;。 介…...

C++:哈希表

哈希表概念 哈希表可以简单理解为&#xff1a;把数据转化为数组的下标&#xff0c;然后用数组的下标对应的值来表示这个数据。如果我们想要搜索这个数据&#xff0c;直接计算出这个数据的下标&#xff0c;然后就可以直接访问数组对应的位置&#xff0c;所以可以用O(1)的复杂度…...

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城狮&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…...

keepalive脑裂

keepalive脑裂 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;p地址只在主上&#xff0c;主停止工作&#xff0c;ip飘移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器。 1、配优先级 2、配置…...

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的时候&#xff0c;编译…...

Perl基础入门指南:从零开始掌握Perl编程

Perl是一种功能强大且灵活的编程语言&#xff0c;广泛应用于系统管理、Web开发、网络编程和文本处理等领域。如果你是编程新手或者想学习一种新的编程语言&#xff0c;Perl是一个不错的选择。本文将带你了解Perl的基础知识&#xff0c;并通过简单的示例代码帮助你快速入门。 什…...

Mybatis SQL注解使用场景

MyBatis 提供了几种常用的注解&#xff0c;主要用于简化 XML 映射文件的编写&#xff0c;使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例&#xff1a; 1. Select Select 注解用于执行查询操作&#xff0c;并将查询结果映…...

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集&#xff0c;该数据集有两个文件&#xff…...

近期matlab学习笔记,学习是一个记录,反复的过程

近期matlab学习笔记&#xff0c;学习是一个记录&#xff0c;反复的过程 matlab的mlx文件在运行的时候&#xff0c;不需要在文件夹路径下&#xff0c;也能运行&#xff0c;但是需要调用子函数时&#xff0c;就需要在文件所在路径下运行 那就先运行子函数&#xff0c;把路径换过来…...

Elasticsearch7.5.2 常用rest api与elasticsearch库

目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式&#xff1a;PUT 请求URL&#xff1a;http://ip/&#xff08;your_index_nam…...

Autosar Dcm配置-0x28服务ComControl-基于ETAS软件

文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…...

平安养老险厦门分公司:提升金融服务,发挥金融力量

为向社会公众普及金融保险知识&#xff0c;传递消费者权益保护理念&#xff0c;平安养老保险股份有限公司厦门分公司&#xff08;以下简称“分公司”&#xff09;积极开展“78保险公众宣传日”系列教育宣传活动。分公司紧扣“保险&#xff0c;让每一步前行更有底气”主题&#…...

【开源合规】开源许可证风险场景详细解读

文章目录 前言关于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-…...

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…...

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox&#xff0c;和Vmware是一样的&#xff0c;只是box更轻量级 1&#xff09;需要注意内存选择&#xff0c;4G 2、启动完成后&#xff0c;需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具&#xff0c;进…...

mvcc 速读

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是MySQL中一种用于实现数据库并发控制的方法&#xff0c;尤其在InnoDB存储引擎中得到了广泛应用。它的主要作用是提高数据库在高并发场景下的性能&#xff0c;并确保数据的一致性。 …...

美容仪维修过程记录

近期维修的家用射频美容仪&#xff0c;发一些维修过程的拆机图片...

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…...

QT实现自定义带有提示信息的透明环形进度条

1. 概述 做界面开发的童鞋可能都会遇到这样的需求&#xff0c;就是有一些界面点击了之后比较耗时的操作&#xff0c;需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢&#xff0c;话不多说&#xff0c;上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...