C++之类和对象基础

article/2025/8/15 6:01:58

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

类和对象

  • 一.类的定义
    • 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.hkcw.cn/article/oSrUnvoNsT.shtml

相关文章

报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not ...解决方法

在运行项目时出现java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualidzz这样的报错 解决方法 1.第一步:在pom文件中将lombok的版本改成最新的 此时1.18.34是新…

2025-03-12 Python深度学习1——安装Anaconda与PyTorch库

文章目录 1 配置 Anaconda1.1 下载1.2 安装1.3 配置环境变量1.4 检查安装 2 安装 PyTorch 库2.1 创建 DL 环境2.2 安装/升级 CUDA2.3 配置环境变量2.4 安装 Pytorch 库方法一(不稳定)方法二(推荐) 2.5 检查安装 3 Pycharm Communi…

C++ 关联式容器:map,multimap,set,multiset

目录 引言 一、关联式容器概述 1.1 与序列式容器的区别 1.2 底层结构 二、set容器详解set介绍 2.1 set的特性 2.2 set的模板参数 2.3 set的常用接口 2.4 set使用示例 三、map容器详解map介绍 3.1 map的特性 3.2 map的模板参数 3.3 map的常用接口 3.4 map使用示例 …

从零开始配置Qt+VsCode环境

从零开始配置QtVsCode环境 文章目录 从零开始配置QtVsCode环境写在前面扩展安装及配置Qt Configure配置 VsCode创建Qt工程VsCodeQMakeMinGwVsCodeQMakeMsvcVsCodeCMakeMinGwVsCodeCMakeMsvcQtCreatorQMakeMinGw->VsCodeQtCreatorQMakeMsvc->VsCodeQtCreatorCMakeMinGw-&g…

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(一) - 三相逆变器的搭建

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(一) - 三相逆变器的搭建 前言一、BLDC电机六步换相简明控制原理二、Simulink中BLDC电机模块的机械连接三、三相逆变电路的搭建四、仿真参数设置与仿真结果验证五、补充内容参考链接 前言 本系列文章分享…

Lapce:一款用 Rust 编写的快速且强大的代码编辑器

Lapce(IPA:/lps/)是一个使用纯 Rust 编写的开源代码编辑器。通过利用 OpenGL 渲染 GUI,以及 Rust 提供的性能,采用Xi-Editor的Rope Science设计,可实现闪电般的快速计算。 Stars 数35888Forks 数1113 主要…

SpringBoot启动后初始化的几种方式

目录 一、静态代码块 二、构造方法 三、PostConstruct 四、InitializingBean 接口 五、 Bean 注解中的 initMethod 六、 CommandLineRunner 接口 七、ApplicationRunner 接口 八、EventListener事件 九、SmartInitializingSingleton接口 十、ApplicationListener接口…

【MySQL课程学习】:MySQL安装,MySQL如何登录和退出?MySQL的简单配置

🎁个人主页:我们的五年 🔍系列专栏:MySQL课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 MySQL在Centos 7环境下的安装: 卸载…

Node.js下载安装及环境配置教程(保姆级教程)

一、安装程序 (安装包放在文章最后需要的友友可自取哦) (1)下载完成后,双击安装包,开始安装Node.js (2)此位置可修改为自己的安装路径,修改完后点击next (3…

com.mysql.cj.jdbc.exceptions.CommunicationsException Communications link failure 问题解决

前言: 一般这个报错大多是网络原因导致的,确保你不是网络问题再往下看 问题 在一个方法上(该方法非常复杂执行时间长)加了 Transactional(rollbackFor Exception.class)后出现了如下图所示的错误 解决: 经过排查并非网络问…

【解决方案】CloudFront VPC Origins 实践流程深入解析 —— 安全高效架构的实战之道

目录 引言一、VPC Origins 的核心价值(一)安全性提升(二)运维效率优化(三)成本节约(四)全球分发能力的保留 二、VPC Origins 的架构解析(一)流量路径设计&…

MySQL性能调优(三):MySQL中的系统库(sys系统库、information_schema)

文章目录 MySQL性能调优数据库设计优化查询优化配置参数调整硬件优化 MySQL中的系统库1.3.sys系统库1.3.1.sys使用须知1.3.2.sys系统库使用1.3.3.查看慢SQL语句慢在哪里1.3.4.小结 1.4.information_schema1.4.1.什么是information_schema1.4.2.information_schema表分类Server层…

MySQL的详细使用教程

目录 1. 连接到MySQL服务器2. 创建和删除数据库2-1创建数据库2-2删除数据库 3. 数据表操作3.1 选择数据库3.2 创建数据表3.3 查询数据表3.4 修改数据表3.5 删除数据表 4. 数据内容操作4.1数据操作1. 插入数据2. 查询数据(1)like模糊查询(%表示…

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原…

【中间件】Pulsar集群安装

目录 一、Pulsar介绍 1.1 Pulsar基本介绍 1.2 Pulsar架构 Producer & Consumer Apache Zookeeper Pulsar Brokers Apache Bookkeeper 二、Zookeeper集群安装 三、Pulsar集群安装 3.1 bookie与broker配置 3.1.1 修改bookie配置文件 3.1.2 修改broker配置文件 3…

41-dify案例分享-基于database插件实现Text2sql的数据库查询图表工作流

1 前言 Text2SQL(或称NL2SQL)是一种自然语言处理技术,旨在将自然语言(Natural Language)问题转化为关系型数据库中可执行的结构化查询语言(Structured Query Language,SQL)&#xf…

数据库-MySQL 实战项目——学生选课系统数据库设计与实现(附源码)

一、前言 该项目非常适合MySQL入门学习的小伙伴,博主提供了源码、数据和一些查询语句,供大家学习和参考,代码和表设计有什么不恰当还请各位大佬多多指点。 所需环境 MySQL可视化工具:navicat; 数据库:MySq…

中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南

目录 背景‌一、环境规划与依赖准备‌1. 服务器规划(3节点集群)2. 系统与依赖‌3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置‌1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置‌4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…

从 0~1 保姆级 详细版 PostgreSQL 数据库安装教程

PostgreSQL数据库安装 PostgreSQL官网 【PostgreSQL官网】 | 【PostgreSQL安装官网_Windows】 安装步骤 step1: 选择与电脑相对应的PostgreSQL版本进行下载。 step2: 双击打开刚才下载好的文件。 step3: 在弹出的setup窗口中点击 …

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…