C++初阶篇----类与对象上卷

目录

  • 引言
  • 1.面向过程和面向对象初步认识
  • 2.类的引入
  • 3.类的定义
    • 3.1声明与定义全部放在类体中
    • 3.2声明与定义分离
  • 4.类的访问限定符及封装
    • 4.1访问限定符
    • 4.2封装
  • 5.类的作用域
  • 6.类的实例化
    • 类是对对象进行描述
    • 一个类(一个类型变量)可以实例化出多个对象
  • 7.类对象模型
    • 7.1类对象的大小
    • 7.2类对象的存储方式
    • 7.3结构体内存对齐规则
  • 8.`this` 指针
    • 8.1 this指针的引出
    • 8.2 this指针的特性
  • 总结:

引言

在面向对象编程(OOP)中,类(Class)和**对象(Object)**是两个核心概念。
简单来说,**类定义了对象的模板,而对象是根据类创建的具体实体**。例如,假设有一个类叫做Car,描述了汽车的属性(如颜色、品牌、型号)和行为(如加速、减速、转向)。那么根据这个类,我们可以创建多个具体的汽车对象,每个对象都有自己的属性和行为,但都基于相同的类模板。

在面向对象编程中,程序主要由对象组成,每个对象都是一个实例,具有特定的属性(成员变量)和行为(成员函数)。类则用来定义对象的模板,描述了一类对象共同的属性和行为。

1.面向过程和面向对象初步认识

面向对象编程(OOP)是一种以对象为中心的编程范式,它将数据和操作数据的方法封装在对象中,使得对象可以通过方法与其他对象进行交互。在面向对象编程中,程序的设计和实现是围绕着对象的概念展开的,强调对象之间的交互和继承关系,以及多态性的特性。

面向过程编程(POP)是一种以过程为中心的编程范式,它将问题分解为一系列的步骤或过程,然后按照顺序执行这些步骤来解决问题。在面向过程编程中,数据和操作数据的方法是分开的,程序的设计和实现是围绕着函数或过程的概念展开的,强调按照步骤执行任务。

C语言是面向过程的,关注的是过程,分析求解问题
而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

2.类的引入

相较于C语言,结构体中只能定义变量,而在C++中,结构体内不仅可以定义变量,还可以定义函数并在内部嵌套调用
如,C语言栈的实现

#include<iostream>using namespace std;
typedef int DataType;
struct Stack
{//初始化函数void Init(size_t capacity=5){_array = (int*)malloc(sizeof(int) * capacity);_capacity = capacity;_size = 0;}void Push(const DataType& data){_array[_size] = data;_size++;}DataType Top(){return _array[_size - 1];}void Destory(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}//成员变量DataType* _array;size_t _capacity;size_t _size;
};int main()
{Stack s;s.Init();s.Push(1);s.Push(3);s.Push(2);cout << s.Top() << endl;s.Destory();return 0;
}

在这里插入图片描述
而在C++中,结构体的定义,更习惯用 class 关键字来替代

3.类的定义

class name
{//成员函数//成员变量};

class 为定义类的关键字,name为类的名字
类的定义方式有俩种

3.1声明与定义全部放在类体中

若成员函数在类中定义,那么编译器可能会当作 内联函数来处理
在这里插入图片描述

3.2声明与定义分离

类声明放
在这里插入图片描述

4.类的访问限定符及封装

4.1访问限定符

C++实现封装的方式:类与对象的属性与方法结合在一起,设置访问权限的选择性将其接口提供外部使用
在这里插入图片描述

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)

4.2封装

在面向对象的三大特性中(封装、继承、多态),主要研究类的封装特性,在类和对象阶段
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。

5.类的作用域

在C中,结构体的定义等价于一个变量的定义,而在C++中类的定义形成了一个新的作用域

C中有全局和局部,static静态
而C++中则形成了一个新的作用域,就好比之前,一块土地有公工区域(公共管理),和非公共区域(无人管理),然后类的定义,开始出现,私人住宅(别人允许你访问,那么便可以做客参观)

在类体外定义成员时,需要标识符 ::作用域操作符指明

void name::fun() 
{//…………
}

6.类的实例化

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

类是对对象进行描述

定义一个类,并没有分配实际的内存空间来存储它

注:类当中的成员函数也没有空间? 类成员函数在定义后,就有了固定的存放位置,当创建类的实例化,并不会重复开辟成员函数的空间

一个类(一个类型变量)可以实例化出多个对象

多个类,分别占用实际的物理空间,储存类成员变量
类比,实例化出对象就像在现实中使用建筑设计图建造出房子,类就是设计图,房子就是实例化
在这里插入图片描述

7.类对象模型

7.1类对象的大小

类对象的大小取决于其成员变量成员函数

1.成员变量的大小:类中的每个成员变量都占用内存空间。基本数据类型(如int、float等)通常占用固定大小的内存空间,而对象、指针或其他用户自定义类型的大小取决于其内部包含的成员变量。
2.对齐规则:在内存中,数据通常按照特定的对齐规则存储,以提高访问速度。对齐规则可以导致成员变量之间存在一些额外的空隙,以保证每个成员变量从正确的内存地址开始。对齐规则通常由编译器和目标平台决定。
3.继承和虚函数:如果类继承自其他类,或者包含虚函数,那么额外的内存空间可能会用于存储指向虚函数表的指针(对于包含虚函数的类)或基类的成员变量(对于派生类)。

如:

//前面所创建的Stack的类与Stack1比较
class Stack1
{int x;int y;int z;
};int main()
{cout << sizeof(Stack) << endl<<sizeof(Stack1)<<endl;
}

在这里插入图片描述

7.2类对象的存储方式

类对象包含类的各个成员
在这里插入图片描述
每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。

代码只保存一份,在对象中保存成员函数的地址
只保存成员变量,成员函数存放在公共的代码段

结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

7.3结构体内存对齐规则

对齐规则和C语言中的结构体对齐规则是一样

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

8.this 指针

8.1 this指针的引出

问题:当俩个同类型的类实例化,调用同一个成员函数,编译器是怎么分辨出,是哪一个面向对象调用函数?

如:

//引用之前所定义的Stack 的类
int main()
{Stack d1;Stack d2;d1.Init();d2.Init();//~~~~return 0;
}
这里调用Init初始化,怎么分辨出是d1,还是d2调用?
这就是this指针的作用了> 在C++中,this指针是一个特殊的指针,它指向当前对象的地址。它是每个非静态成员函数的隐式参数。当你在一个**成员函数内部引用类的成员变量或者调用其他成员函数**时,编译器会自动地插入this指针。

实现的底层逻辑:
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

8.2 this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
    this形参。所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
    递,不需要用户传递

在这里插入图片描述

总结:

C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。

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

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

相关文章

Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法&#xff0c;只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…

分布式事务简介

分布式事务简介&#xff0c;通过组内分享学习到的知识&#xff0c;并进行讨论。 主要内容 分布式事务简介 分布式事务是指跨越多个数据库或服务的一系列操作&#xff0c;这些数据库或服务可能分布在网络的不同节点上&#xff0c;它们共同组成一个完整的逻辑工作单元&#xf…

GEE必须会教程—蒸散发数据时间序列分析与下载

今天带来的有关蒸散发数据的下载代码&#xff0c;蒸散发数据在气象气候&#xff0c;农业干旱监测等领域应用广泛&#xff0c;那么在GEE上如何方便快捷获取蒸散发数据呢&#xff1f;今天跟着小编分享代码&#xff0c;快来学习吧&#xff01;&#xff01; A.定义研究区域 //定义…

【前端素材】推荐优质数据统计后台管理系统网页Cleopatra.平台模板(附源码)

一、需求分析 在线后台管理系统是指供管理员或运营人员使用的Web应用程序&#xff0c;用于管理和监控网站、应用程序或系统的运行和数据。它通常包括一系列工具和功能&#xff0c;用于管理用户、内容、权限、数据等。下面是关于在线后台管理系统的详细分析&#xff1a; 1、功…

ssh简介以及 windows 安装ssh教程

SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于计算机之间的加密登录和其他安全网络服务。通过 SSH&#xff0c;用户可以安全地访问远程计算机&#xff0c;执行命令、传输文件等操作。SSH 使用公钥加密技术&#xff0c;确保数据传输的安全性。本文将从…

TypeScript 哲学 - 2、Narrowing

四种类型守卫 1、truthiness narrowing 2、 3、 4、 control flow analysis

C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)

和黛玉学编程呀&#xff0c;大家一起努力呀............. 结构体类型的声明 回顾一下 struct tag { member-list; }variable-list; 创建和初始化 我们知道&#xff0c;在C语言中&#xff0c;对于一些数据是必须初始化的&#xff0c;但是结构体怎么创建并且初始化呢&#xff1…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接&#xff0c;四次挥手释放连接&#xff0c;确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…

springboot+vue+mysql项目使用的常用注解

实体类常用注解 Data Data 是一个 Lombok 提供的注解&#xff0c;使用 Data 注解可以简化代码&#xff0c;使代码更加简洁易读。 作用&#xff1a;自动为类生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依赖 <depende…

rk3568-一种基于wifi的网络环境搭建方案

前言&#xff1a; PC--Ubuntu--开发板 三者之间的网络互相ping通很重要&#xff0c;尤其是ubuntu和开发板互ping成功最关键&#xff0c;关系到nfs&#xff0c;tftp等常用的开发手段。现在大多数开发板都带有wifi芯片&#xff0c;现在提供一种方案可以三个设备无线地搭建网络环境…

Open3D0.14.1编译、安装、demo使用教程

写在前面 本文内容 Open3D在0.15版之前&#xff0c;没有提供编译好的包&#xff0c;要使用C版本必须自己编译&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的编译、使用教程&#xff1b; Open3D其他版本的编译和使用相关教程见 各个版本的Open3D、PCL的编译…

STL常见容器(map/multimap容器)---C++

STL常见容器目录&#xff1a; 8.map/ multimap容器8.1 map基本概念8.2 map构造和赋值8.3 map大小和交换8.4 map插入和删除8.5 map查找和统计8.6 map容器排序8.6.1 内置类型排序8.6.2 自定义类型排序8.6.3 自定义和内置类型混合排序 8.map/ multimap容器 两者基本一致&#xff…

用node写后端环境运行时报错Port 3000 is already in use

解决方法:关闭之前运行的3000端口,操作如下 1.WindowR输入cmd确定,打开命令面板 2.查看本机端口详情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,这里要看你自己项目中package.joson的启动命令是什…

Flink:动态表 / 时态表 / 版本表 / 普通表 概念区别澄清

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Python+PySide6实现一个选择文件并做处理的GUI办公小工具(完整代码)

目录 专栏导读背景安装注意事项完整代码结尾专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅 🕷 此外还…

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …

安卓使用ExoPlayer出现膨胀类异常

1.导包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入权限&#xff0c;我这里加了忘了与读写权限 <uses-permission android:name"android.permissio…

Tomcat服务部署、优化

一 Tomcat的基本介绍 Tomcat概念 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。 当在一台机器上配置好Apache 服务器…

VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机&#xff08;完整安装步骤详细图文教程&#xff09; 一、Windows XP1.Windows XP简介2.Windows XP 的下载地址 二、配置 Windows XP 虚拟机运行环境1.新建虚拟机2.选择类型配置3.插入WinXP光盘映像文件(ISO)4.选择操作系统5.命名…

Home Assistant:基于Python的智能家居开源系统详解

Home Assistant&#xff1a;基于Python的智能家居开源系统详解 在数字化和智能化的时代&#xff0c;智能家居系统成为了现代家庭的新宠。它们能够让我们更加方便地控制家中的各种设备&#xff0c;实现自动化和个性化的居住体验。其中&#xff0c;Home Assistant作为一款基于Pyt…