C++之类和对象基础

⾯向对象三⼤特性:封装、继承、多态

类和对象

  • 一.类的定义
    • 1. 类的定义格式
    • 2.类域
  • 二.实例化
    • 1.对象
    • 2.对象的大小
  • 三.this指针

在这里插入图片描述

在 C++ 的世界里,类和对象构成了面向对象编程(Object-Oriented Programming,OOP)的核心框架,如同搭建高楼大厦的基石,支撑起复杂且灵活的程序结构。无论是开发游戏、设计大型软件系统,还是进行底层驱动开发,类和对象的合理运用都能让代码更具逻辑性、可维护性和扩展性。

一.类的定义

类是一种用户自定义的数据类型,它将数据(成员变量)和操作这些数据的函数(成员函数)封装在一起,就像一张设计蓝图,定义了某一类事物的属性和行为。

1. 类的定义格式

C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接提供给外部的⽤⼾使⽤。

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。

class 类名 {private:// 私有成员变量和函数,只能在类内部访问数据类型 成员变量名;返回类型 私有成员函数(参数列表);public:// 公有成员变量和函数,可以在类外部访问数据类型 成员变量名;返回类型 公有成员函数(参数列表);protected:// 保护成员变量和函数,可在类及其派生类中访问数据类型 成员变量名;返回类型 保护成员函数(参数列表);
};

private、public和protected是访问控制修饰符,用于限定成员的访问权限。

  1. public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

  2. 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到}即类结束。

  3. class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

  4. ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
    在类里定义的函数默认为inline格式,若在类外定义时,也可以通过认为加inline来实现内联

2.类域

类域,简单来说就是类所定义的范围,类中的成员变量和成员函数都处于这个特定的范围之内。在类域中定义的名字(成员变量名、成员函数名等),其作用范围仅限于该类,与类外部的同名标识符相互独立。
比如,在一个Student类中定义了name成员变量,而在类外部的其他地方也定义了name变量,这两个name分别属于不同的作用域,不会产生冲突。
在访问类域中的成员时,需要遵循一定的规则。如果在类的成员函数内部访问类的成员变量,无需特殊的前缀,直接使用变量名即可,因为成员函数本身就处于类域之中,编译器能够明确识别这是类内的成员。例如:

class Student {
private:string name;int age;
public:void setInfo(string n, int a) {name = n;  // 直接访问类域内的成员变量nameage = a;}
};

但在类外部访问类的成员时,就需要通过对象或对象指针,并结合点运算符.或箭头运算符->来明确指定访问类域中的成员。像这样:

int main() {Student stu;stu.setInfo("Tom", 20);return 0;
}

类域的存在,一方面实现了数据和操作的封装,将相关的成员变量和函数聚集在一起,增强了代码的内聚性;另一方面,通过限制成员的作用范围,避免了命名冲突,提高了代码的可读性和可维护性。同时,在继承关系中,类域的规则也会影响派生类对基类成员的访问和覆盖,这进一步体现了类域在构建复杂类体系时的重要作用。

二.实例化

1.对象

对象是类的具体实例,就像依据设计蓝图建造出的实际建筑。每个对象都有自己独立的存储空间,存储着类中定义的成员变量的值,并且可以调用类中定义的成员函数。

  1. ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。

  2. 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。

  3. ⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。

2.对象的大小

在计算对象的大小时,内存分配规则基本与C语言结构体一致。
具体可以看此篇博客 : 结构体内存。
但类的内存分配有几个特例:

  1. 类函数所占的内存,是不计算在类的内存大小当中的。由于每次调用类函数时,所调用的是同一个函数,因此没有比要在每次实例化的过程中为函数分配一块内存,而是分配在了栈区。
  2. 当类为空时,为表示类的存在,所以会默认给1字节大小的空间。

三.this指针

在 C++ 类的成员函数中,this指针是一个隐含的指针变量,它指向调用该成员函数的对象。this指针在类和对象的交互中起着至关重要的作用,帮助成员函数准确地访问和操作所属对象的成员变量。
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。

  1. this 指针的作用​
    当多个对象调用同一个成员函数时,this指针使得函数能够区分到底是哪个对象在调用它。
  2. this 指针的使用场景
    除了在成员函数中访问成员变量,this指针还常用于函数返回对象自身、解决参数与成员变量同名问题等场景。
  3. 类的成员函数中访问成员变量,本质都是通过this指针访问的。只不过在这里可以隐式使用,编译器会自动处理。
    this指针不能够出现在形参与实参的位置,但是可以在函数体内显⽰使⽤this指针。他只能够在类里使用

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

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

相关文章

计算机网络——HTTP/IP 协议通俗入门详解

HTTP/IP 协议通俗入门详解 一、什么是 HTTP 协议?1. 基本定义2. HTTP 是怎么工作的? 二、HTTP 协议的特点三、HTTPS 是什么?它和 HTTP 有啥区别?1. HTTPS 概述2. HTTP vs HTTPS 四、HTTP 的通信过程步骤详解: 五、常见…

使用 Java 实现一个简单且高效的任务调度框架

目录 一、任务调度系统概述 (一)任务调度的目标 (二)任务调度框架的关键组成 二、任务状态设计 (一)任务状态流转设计 (二)任务表设计(SQL) 三、单机任…

基于GPT 模板开发智能写作辅助应用

目录 项目说明 1. 项目背景 2. 项目目标 3. 功能需求 4. 技术选型 项目结构 详细代码实现 前端代码(client) client/src/main.js client/src/App.vue client/src/components/HistoryList.vue 后端代码(server) server/app.js server/routes/api.js server/mo…

linux 使用nginx部署next.js项目,并使用pm2守护进程

前言 本文基于:操作系统 CentOS Stream 8 使用工具:Xshell8、Xftp8 服务器基础环境: node - 请查看 linux安装node并全局可用pm2 - 请查看 linux安装pm2并全局可用nginx - 请查看 linux 使用nginx部署vue、react项目 所需服务器基础环境&…

使用huggingface_hub需要注意的事项

在安装huggingface_hub的时候要注意如果你的python是放在c盘下时记得用管理员模式命令行来安装huggingface_hub,否则安装过程会报错,之后也不会有huggingface-cli命令。 如果安装时因为没有用管理员权限安装而报错了,可以先卸载huggingface-…

Spring MVC @RequestHeader 注解怎么用?

我们来详细解释一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于将 HTTP 请求中的**请求头(Request Headers)**的值绑定到 Controller 方法的参数上。 请求头是 HTTP 请求的一部分,包含了关于…

Rust 学习笔记:关于结构体的例题

Rust 学习笔记:关于结构体的例题 Rust 学习笔记:关于结构体的例题下面的程序能通过编译吗?下面的程序能通过编译吗?下面的程序能通过编译吗?哪种说法最能描述 Display 和 Debug 特质之间的区别?下面哪个选项…

STM32 SPI通信协议

1. SPI协议概述 1.1 什么是SPI? SPI(Serial Peripheral Interface)是由摩托罗拉公司于1980年代提出的同步串行通信协议,主要用于短距离高速芯片间通信。作为四线制全双工通信协议,它以简单的硬件实现和高效的传输速率…

92.一个简单的输入与显示示例 Maui例子 C#例子

一、关于项目命名的注意事项 在开发.NET MAUI项目时,项目命名是一个不可忽视的细节。如果你习惯了在C#控制台或WPF项目中使用中文项目名称,那么在.NET MAUI中,你可能会遇到一些问题。我之前就因为使用中文项目名称而导致项目无法直接运行&am…

Locate 3D:Meta出品自监督学习3D定位方法

标题: Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要: 我们提出了 Locate 3D,这是一种可根据指代表达(如“沙发和灯之间的小咖啡桌”)在三维场景中定位物体的模型。Locate 3…

FastAPI 与数据库交互示例

目录 安装必要的包完整代码示例运行应用使用说明API 端点说明代码解析 下面将创建一个简单的 FastAPI 应用程序,演示如何与 SQLite 数据库进行交互。这个例子包括创建、读取、更新和删除(CRUD)操作。 安装必要的包 首先,需要安装…

YOLO旋转目标检测之ONNX模型推理

YOLO旋转检测相较于目标检测而言,其只是最后的输出层网络发生了改变,一个最明显的区别便是:目标检测的检测框是xywh,而旋转检测则为xywha,其中,这个a代表angle,即旋转角度,其余的基本…

架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】

本文主要讨论了企业总体技术架构规划的重要性与实施建议。针对Oracle战略专家培训课件中的内容,文章强调了行业面临的挑战及现状分析、总体技术架构探讨、SOA集成解决方案讨论与问题解答等方面。文章指出,为了消除信息孤岛、强化应用系统,需要…

llamafactory-cli webui启动报错TypeError: argument of type ‘bool‘ is not iterable

一、问题 在阿里云NoteBook上启动llamafactory-cli webui报错TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…

Gas 优化不足、升级机制缺陷问题

以下是针对智能合约中 Gas 优化不足 与 升级机制缺陷 的技术风险分析与解决方案: 一、Gas 优化不足 1. 核心问题 Gas 优化不足会导致合约执行成本过高,直接影响用户体验和协议可行性,尤其在交易高峰期可能引发链上拥堵或交易失败。 2. 常见风险点 冗余计算与存储操作 例如…

使用xlwings计算合并单元格的求和

有如下一个excel表 表内有合并单元格,现在需要求和,不能直接下拉填充公式怎么办? 通常的办法是先取消合并单元格,计算后,再次合并单元格,比较繁琐。 在此,尝试使用python和xlwings运行直接给出…

[创业之路-354]:农业文明到智能纪元:四次工业革命下的人类迁徙与价值重构

农业文明到智能纪元:四次工业革命下的人类迁徙与价值重构 从游牧到定居,从蒸汽轰鸣到算法洪流,人类文明的每一次跨越都伴随着生产关系的剧烈震荡。四次工业革命的浪潮不仅重塑了物质世界的生产方式,更将人类推向了身份认同与存在…

LeetCode 2302.统计得分小于 K 的子数组数目:滑动窗口(不需要前缀和)

【LetMeFly】2302.统计得分小于 K 的子数组数目:滑动窗口(不需要前缀和) 力扣题目链接:https://leetcode.cn/problems/count-subarrays-with-score-less-than-k/ 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说&…

kafka学习笔记(四、生产者(客户端)深入研究(二)——消费者协调器与_consumer_offsets剖析)

1.消费者协调器和组协调器 如果消费者客户端中配置了多个分配策略,则多消费者的分区分配交由消费者协调器和组协调器来完成,他们之间使用一套组协调协议进行交互。 1.1.在均衡原理 将全部消费者分成多个子集,每个消费者组的子集在服务中对…

快速将FastAPI接口转为模型上下文协议(MCP)!

fastapi_mcp 是一个用于将 FastAPI 端点暴露为模型上下文协议(Model Context Protocol, MCP)工具的库,并且支持认证功能。 环境macbook,python3.13 pip install fastapi uvicorn fastapi-mcp 代码 from fastapi import FastAPI, …