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

【C++初阶】—— 类和对象 (上)

📝个人主页🌹:EterNity_TiMe_
⏩收录专栏⏪:C++ “ 登神长阶 ”
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述

在这里插入图片描述

类和对象

  • 1. 初步认识C++
  • 2. 类的引入
  • 3. 类的定义
    • 声明和定义全部放在类体中
    • 声明和定义分开存放
  • 4. 类的访问限定符
  • 5. 类的实例化
  • 6. 类对象模型
    • 如何计算类对象的大小
    • 类对象的存储方式
  • 7. this指针
    • this指针的特性
  • 8. 总结


前言:在前面几节我们为正式进入C++做足了铺垫,现在我们有了足够的基础让我们进入C++,让我们来进入类和对象来真正了解C++!

本篇主要内容:
类的相关知识
this指针


1. 初步认识C++

1. 我们知道之前学习的C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

2. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

举个例子,就像我们洗衣服,在C语言中我们需要一步一步按过程操作来手洗,而C++则是有了很多对象,对象间相互交互来完成洗衣服!
在这里插入图片描述

在这里插入图片描述


2. 类的引入

C语言结构体中只能定义变量,不可以定义函数,但是在C++中,结构体内不仅可以定义变量,也可以定义函数。

struct pxt
{char b[100] = { "hello world!" };int a = 2024;void test(){cout << "hello world!" << endl;}};
int main()
{pxt xyyj;xyyj.test();cout << xyyj.b << endl;return 0;
}

在这里插入图片描述

上面结构体的定义就是类,但在C++中更喜欢用class来代替


3. 类的定义

// C++中更喜欢用class
class className
{// 类体:由成员函数和成员变量组成
};  
// 一定要注意后面的分号
  • class为定义类的关键字,className为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略
  • 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数

类的两种定义方式:

  • 声明和定义全部放在类体中
  • 声明和定义分开存放

声明和定义全部放在类体中

class pxt
{int a = 2024;char b[100] = { "hello world!" };int c = 666;void test(){cout << b << " " << a << " " << c << endl;}
};
int main()
{pxt xyyj;xyyj.test();return 0;
}

注意: 成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

声明和定义分开存放

// func.h
class pxt
{int a = 2024;char b[100] = { "hello world!" };int c = 666;void test();
};
// func.cpp
void test()
{cout << b << " " << a << " " << c << endl;
}
// test.c
int main()
{pxt xyyj;xyyj.test();return 0;
}

如果这样声明和定义那么将无法完成编译!
在这里插入图片描述
test在func.cpp中找不到pxt类中的成员变量

// 因此我们应该指明在pxt中寻找,否则可能以为定义一个新函数
void pxt::test()
{cout << b << " " << a << " " << c << endl;
}

4. 类的访问限定符

在这里插入图片描述

访问限定符说明:

  • public修饰的成员在类外可以直接被访问
  • protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到最后即类结束。
  • class的默认访问权限为private,struct为public(因为struct要兼容C)
class pxt
{
public:void test(){cout << b << " " << a << " " << c << endl;}
private:int a;char b[100] = { "hello world!" };int c;
};
int main()
{pxt xyyj;xyyj.test();//cout << xyyj.b << endl; // 无法运行//cout << xyyj.a << endl; // 无法运行return 0;
}

public修饰的成员是共有的,类外可以访问
private修饰的的成员是私有的类外不能访问

注意:成员函数不管成员变量是私有还是公有,它都能直接访问,因为它们都属于这个类


5. 类的实例化

用类类型创建对象的过程,称为类的实例化

  • 类是对对象进行描述的,定义出一个类并没有分配实际的内存空间来存储它
  • 实例化出的对象 占用实际的物理空间,存储类成员变量
// 在没有实例化之前并不会占用实际物理空间
class pxt
{
public:......
private:int a;
};

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图
在这里插入图片描述
在这里插入图片描述


6. 类对象模型

如何计算类对象的大小

class pxt
{
public:void test(){cout << b << " " << a << endl;}
private:int a;char b;
};
class xyyj
{
public:int a;char b;
};
int main()
{cout << "pxt -> sizeof: " << sizeof(pxt) << endl;cout << "xyyj -> sizeof: " << sizeof(xyyj) << endl;return 0;
}

在学C语言结构体的时候我们讲过结构体内存对齐规则,那么C++中多了个函数该怎么计算呢,我们先来看看结果
在这里插入图片描述

初步结论:

  • 类的成员函数不算在类的大小中
  • 类的大小遵守结构体内存对齐规则

类对象的存储方式

好家伙,两个类结果居然是一样的,这到底是什么情况?为啥类中的成员函数不占空间?

这其实和类对象的存储方式有关——只保存成员变量,成员函数存放在公共的代码段

在这里插入图片描述
每个对象虽然实例化的值不一样,但是调用的函数是相同的,将函数单独放在一个区域能节省空间

综上所述:

  • 类的成员函数不算在类的大小中
  • 类的大小遵守结构体内存对齐规则
  • 空类的大小是一个字节,用来唯一标识这个类的对象

忘了结构体内存对齐的可以复习一下:
结构体内存对齐


7. this指针

我们先来定义一个日期类:

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.Init(2024, 5, 20);d2.Init(2024, 5, 21);d1.Print();d2.Print();return 0;
}

那么Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

  • C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问

this指针的特性

this指针的特性:

  • this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  • 只能在“成员函数”的内部使用
  • this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  • this指针是“成员函数”第一个隐含的指针形参,不需要用户传递

在这里插入图片描述
虽然我们知道成员函数中存在this指针,但是我们传参不能传this指针

public:// 绝对不能这么定义void Init(Date*this, int year, int month, int day){_year = year;_month = month;_day = day;} // false

使用this指针将对象的地址传入函数中函数体就可以区分不同对象了


8. 总结

本章是类和对象的第一课,我们简单了解了类的基本概念和特性和this指针,this指针对后面用处很大,类在C++是很重要的希望大家能打好基础!

谢谢大家支持本篇到这里就结束了
在这里插入图片描述

相关文章:

【C++初阶】—— 类和对象 (上)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 初步认识C2. 类的引入3. 类的定义声明和定义全部放在类体中声明和定义分开存放 4.…...

基础—SQL—图形化界面工具的DataGrip使用(2)

一、回顾与引言 &#xff08;1&#xff09; 上次内容&#xff0c;博客讲到了DDL语句的数据库操作、表操作、表字段的操作的相关语法&#xff0c;然而之前都是在MySQL的命令行当中去操作演示的。这种方式可以用&#xff0c;但是使用的话&#xff0c;第一&#xff0c;在我们日常…...

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…...

四川景源畅信:抖音小店新手如何做?

随着短视频平台的兴起&#xff0c;抖音小店成为了许多创业者的新选择。但是&#xff0c;对于新手来说&#xff0c;如何在抖音上开设并经营好自己的小店呢?本文将围绕这一问题展开讨论。 一、明确目标和定位作为抖音小店的新手&#xff0c;首先要明确自己的经营目标和定位。是想…...

EventSource

什么是EventSource EventSource 是一个用于服务器推送事件&#xff08;Server-Sent Events, SSE&#xff09;的接口&#xff0c;它允许服务器推送实时更新到浏览器。与 WebSocket 不同&#xff0c;SSE 是单向的&#xff08;服务器到客户端&#xff09;&#xff0c;适用于更新频…...

Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字

场景需求&#xff1a; Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字。如下图&#xff1a;默认提示字变成了英文&#xff0c;如何将其 变成 汉字提示呢&#xff1f; 解决方案&#xff1a; 1.方案1&#xff1a;修改DOM内容 不提倡此方案&#xf…...

【简单介绍下线性回归模型】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

有限元法之有限元空间的构造

目录 一、区域Ω的剖分 二、三角形一次元 三、一次元的基函数与面积坐标 四、三角形二次元及其基函数 前两节我们介绍了有限元基本概念和变分理论的推导&#xff0c;本节我们继续探讨有限元空间的构造。 一、区域Ω的剖分 对矩形区域进行三角剖分&#xff0c;其中x方向剖…...

高通车规芯片分析

高通三款芯片 SA8155P 7nm SA8295P 5nm SA8255P 5nm 分析AECQ等级 AECQ100里面定义了5个工作环境温度等级&#xff1a;Grade0&#xff1a;-40-150 Grade1&#xff1a;-40-125 Grade2&#xff1a;-40-105 Grade3&#xff1a;-40-85 Grade4&#xff1a;0-70AEC-Q100整体认证测试…...

Flutter 中的 TextButton 小部件:全面指南

Flutter 中的 TextButton 小部件&#xff1a;全面指南 在Flutter的世界里&#xff0c;TextButton是一个基础的小部件&#xff0c;用于创建只包含文本的按钮。它通常用于对话框、表单以及需要强调主要操作的界面。本文将为您提供一个全面的指南&#xff0c;帮助您了解如何使用T…...

通过键值对访问字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将字典的内容输出也比较简单&#xff0c;可以直接使用print()函数。例如&#xff0c;要想打印dictionary字典&#xff…...

海外仓扫码管理系统怎么选?精准,高效管理需求才是核心需求

海外仓对那些想拓展国际市场的商家来说还是非常重要的&#xff0c;大部分的货物都需要先运到海外仓&#xff0c;才能继续进行下一步的物流快递发货。 那对于海外仓本身来说&#xff0c;当面临大量订单的时候&#xff0c;怎么快速的管理订单&#xff0c;拣选货物就变得十分重要…...

基于51单片机的智能灯光控制系统

一.硬件方案 智能灯光控制系统由单片机最小系统、人体感应模块、关照强度模块、灯光控制模块、电源模块和灯泡组成。本文以STC89C52单片机为核心&#xff0c;通过利用光照度和红外人体感应相结合主动与被动的探测方法&#xff0c;现了室内无人或者关照充足时灯光自动光灯&…...

测试开发面试题

简述自动化测试的三大等待 强制等待。直接使用time.sleep()方法让程序暂停指定的时间。优点是实现简单&#xff0c;缺点是不够灵活&#xff0c;可能会导致不必要的等待时间浪费。隐式等待。设置一个固定的等待时间&#xff0c;在这个时间内不断尝试去查找元素&#xff0c;如果…...

多线程JUC 第2季 BlockingQueue 阻塞队列

一 阻塞队列 1.1 阻塞队列介绍 阻塞队列&#xff08;BlockingQueue&#xff09;是一个在队列基础上又支持了两个附加操作的队列&#xff1a; put方法&#xff1a;当队列装满时&#xff0c;添加的线程则被阻塞&#xff0c;直到队列不满&#xff0c;则可用。 take方法&#x…...

【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索

博主PS&#xff1a;你可以把他理解为&#xff0c;查询猜测&#xff0c;膨胀查询&#xff0c;查询的第六感。 全文搜索支持查询扩展&#xff08;尤其是其变体“盲查询扩展”&#xff09;。 当搜索短语太短时&#xff0c;这通常很有用&#xff0c;这通常意味着用户依赖于全文搜索…...

【面试必看】Java并发

并发 1. 线程 1. 线程vs进程 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。 系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个 JVM 的进…...

C++的第一道门坎:类与对象(一)

1.面向过程与面向对象 1.1面向过程 我们之前学习的C语言就是一种面向过程的语言&#xff0c;面向过程的语言强调的是具体实现的过程&#xff0c;一般用函数来具体实现。我们用面向过程的思想&#xff0c;就可以把炒菜分为以下几个步骤: 1.2面向对象 而对于面向对象的语言而言…...

经典面试题:MySQL如何调优?

目录 前言1. SQL查询优化2. 索引优化3. 表结构设计4. 硬件与配置优化5. 日常维护6. 性能测试与基准测试 前言 MySQL如何进行调优&#xff1f;这是面试中容易被问到的高频问题。 1. SQL查询优化 避免使用select* &#xff1a;只选取需要的列&#xff0c;减少数据传输量。使用…...

【程序员如何送外卖】

嘿&#xff0c;咱程序员要在美团送外卖&#xff0c;那还真有一番说道呢。 先说说优势哈&#xff0c;咱程序员那逻辑思维可不是盖的&#xff0c;规划送餐路线什么的&#xff0c;简直小菜一碟。就像敲代码找最优解一样&#xff0c;能迅速算出怎么送最省时间最有效率。而且咱平时…...

Zot存储清理策略终极指南:自动化管理镜像生命周期

Zot存储清理策略终极指南&#xff1a;自动化管理镜像生命周期 【免费下载链接】zot zot - A scale-out production-ready vendor-neutral OCI-native container image/artifact registry (purely based on OCI Distribution Specification) 项目地址: https://gitcode.com/Gi…...

CANN8.5-ops-transformer更新了什么昇腾NPU算子

CANN 8.5 在 2024 Q4 发布&#xff0c;ops-transformer 仓库跟进了三个重要更新&#xff1a;FlashAttention V2 的反向传播融合、MC2 通算融合的多卡拓扑适配、以及新增的 GroupedAttention 算子。如果你已经用 CANN 8.0 在跑大模型推理&#xff0c;这篇帮你判断要不要升级。 F…...

Cosm算法突破:Gset最大Ising问题求解新纪元

1. Cosm算法突破&#xff1a;Gset最大Ising问题求解新纪元在组合优化领域&#xff0c;Gset基准问题集已经困扰了研究者25年之久。这些看似简单的数学问题背后&#xff0c;隐藏着从无人机集群实时决策到超大规模集成电路设计等众多实际应用的优化需求。作为NP难问题的典型代表&a…...

保姆级教程:在Gazebo中为你的ROS机器人添加激光雷达和摄像头(附完整xacro配置)

Gazebo传感器配置实战&#xff1a;从激光雷达到摄像头的全流程解析 在机器人仿真开发中&#xff0c;让虚拟机器人"看得见"往往比让它"动起来"更具挑战性。许多开发者精心设计了URDF模型&#xff0c;却在Gazebo中遭遇传感器数据无法显示的困境——激光雷达没…...

模块型OLT跟光模块有什么区别?

模块型OLT跟光模块有什么区别&#xff1f;明明是同一个 SFP 接口&#xff0c;插上去长得也差不多&#xff0c;为什么有的叫“光模块”&#xff0c;有的叫“模块型 OLT”&#xff1f; 它们到底有什么区别&#xff1f;能不能互换&#xff1f;选错了会怎样&#xff1f;同样是 SFP …...

告别CubeMX思维定式:用S32DS的Processor Expert玩转S32K144外设配置(含FreeRTOS组件添加)

从CubeMX到Processor Expert&#xff1a;S32K144高效开发实战指南 在嵌入式开发领域&#xff0c;工具链的选择往往决定了开发效率的上限。对于习惯了ST生态的开发者来说&#xff0c;CubeMX的图形化配置已成为肌肉记忆般的操作。但当项目需求将我们推向NXP的S32K系列时&#xff…...

STM32以太网实战:手把手教你配置SMI接口,搞定PHY寄存器读写

STM32以太网实战&#xff1a;手把手教你配置SMI接口&#xff0c;搞定PHY寄存器读写 在嵌入式以太网开发中&#xff0c;PHY芯片的配置往往是项目成败的关键。很多开发者能够轻松完成MAC层的初始化&#xff0c;却在PHY寄存器读写这个环节卡壳——明明硬件连接正确&#xff0c;却无…...

SystemVerilog驱动强度详解:从概念到工程实践

1. 项目概述&#xff1a;为什么需要关注驱动强度&#xff1f;在数字电路设计和验证领域&#xff0c;SystemVerilog 是我们描述硬件行为、构建测试平台的核心语言。很多工程师&#xff0c;尤其是刚入行的朋友&#xff0c;往往把精力集中在always块、interface、UVM这些“大件”上…...

2026 SSH工具推荐:不装传统面板,还有什么更适合管理 Linux 服务器?

这几年很多人选 SSH 工具&#xff0c;已经不只是为了“远程登上服务器敲命令”。 真正常见的需求其实是&#xff1a;连上服务器之后&#xff0c;还要继续完成文件管理、服务部署、HTTPS 配置、站点检查&#xff0c;甚至多台 VPS 的统一管理。 也正因为这样&#xff0c;到了 202…...

全域流量矩阵系统的运筹学解法:用线性规划模型,算出你100个账号的最优流量分配

手里有100个账号&#xff0c;抖音30个、小红书25个、视频号20个、B站15个、快手10个——然后呢&#xff1f;大多数人的做法是&#xff1a;每个平台平均发&#xff0c;每个账号随便发&#xff0c;发完看天吃饭。这不叫矩阵运营&#xff0c;这叫资源浪费。今天换个完全不同的视角…...