C++类和对象入门(二)

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


一、类的作用域

       类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int  _age;
};

        这里需要指定PrintPersonInfo是属于Person这个类域

void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;
}

二、类的实例化

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

     1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。

       类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。

       谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊

     2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

int main()
{Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”return 0;
}

       people类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

     3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。


三、类对象模型

1.如何计算类对象的大小

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?为什么类的大小不计算成员函数的大小呢?

以下述类为例:

class A
{
public:void PrintA(){cout<<_a<<endl;}
private:char _a;
};

2.类对象的存储方式猜测

①  对象中包含类的各个成员

缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

②  代码只保存一份,在对象中保存存放代码的地址

③   只保存成员变量,成员函数存放在公共的代码段

问题:对于上述三种存储方式,那计算机到底是按照那种方式来存储的?

我们再通过对下面的不同对象分别获取大小来分析看下

     ①  类中既有成员变量,又有成员函数

class A1 
{
public:void f1() {}
private:int _a;
};

     ②  类中仅有成员函数 

class A2 
{
public:void f2() {}
};

     ③  类中什么都没有---空类

class A3
{};

验证结果:

结论:很明显猜测三是正确的

       一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。

       注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

3. 结构体内存对齐规则

     ①第一个成员在与结构体偏移量为0的地址处。

     ②其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8

     ③结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

     ④如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

4.小提问 (面试题)

①结构体怎么对齐?为什么要进行内存对齐?

②如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐?

③什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景?

       答案大家自己进行思考动手查阅哦!!!


结语:关于C++类和对象二次分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言,最后祝大家新的一年里学业有成,天天开心~~~ 

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

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

相关文章

vue3快速入门

文章目录 1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue 3. Vue3核…

主流芯片工艺简单了解

目前主流的工艺 7纳米工艺&#xff08;7nm&#xff09;&#xff1a;7纳米工艺是目前的先进工艺之一&#xff0c;由台积电&#xff08;TSMC&#xff09;和三星等制造厂商推出。它允许在芯片上放置更多的晶体管&#xff0c;提供更高的性能和更低的功耗。7nm工艺被广泛用于处理器…

Laucher中activtyA启动APP进程中的ActivityB

第一步&#xff1a;解析要启动的Activity信息 Launcher通过Instrumentation类&#xff0c;在Instrumentation中通过ServiceManager拿到AMS的Binder和AMS通信&#xff0c;调用AMS里面的startActivity方法&#xff0c;同时把Launcher进程的包名和所对应的ApplicationThread(Bind…

关于爬取所有哔哩哔哩、任意图片、所有音乐、的python脚本语言-Edge浏览器插件 全是干货!

这些都是现成的并且实时更新的&#xff01;从次解放双手&#xff01; 首先有自己的edge浏览器基本上都有并且找到插件选项 1.哔哩哔哩视频下载助手&#xff08;爬取哔哩哔哩视频&#xff09; bilibili哔哩哔哩视频下载助手 - Microsoft Edge Addons 下面是效果&#xff1a; 2.图…

centOS linux 宝塔 部署django 遇坑小记

按照网上的视频教程&#xff0c;一步一步操作&#xff0c;最后下来还是没有启动成功。 于是通过Xshell 7 登录服务器&#xff0c;进入项目目录&#xff0c;激活虚拟环境&#xff0c;运行 python manage.py runserver 发现报错。 source bin/activate # 激活虚拟环境py…

新人进入互联网行业

今天谈一个很多人关心的问题&#xff1a; 新人如何进入互联网行业&#xff1f; 大部分人都是通过招聘&#xff0c;进入互联网公司。如果你专业对口&#xff0c;是软件类或者美术类的学生&#xff0c;那很简单&#xff0c;专注自己的方向就 OK&#xff0c;行业非常缺人&#xf…

2024年数学建模美赛 A~E 题目解析

2024美赛A题&#xff1a;资源可用性和性别比例 背景 尽管一些动物物种不属于通常的雄性或雌性&#xff0c;大多数物种在出生时要么显著地为雄性&#xff0c;要么为雌性。虽然许多物种在出生时表现出1:1的性别比&#xff0c;但其他物种则偏离了这个均衡的性别比例。这被称为性…

PostgreSQL 也很强大,为何在中国大陆,MySQL 成为主流,PostgreSQL 屈居二线呢?

问题&#xff1a; PostgreSQL 也很强大&#xff0c;为何在中国大陆&#xff0c;MySQL 成为主流&#xff0c;PostgreSQL 屈居二线呢&#xff1f;PostgreSQL 能否替代 MySQL&#xff1f; 当我们讨论为何 MySQL 在中国大陆成为主流而 PostgreSQL 屈居二线时&#xff0c; 我们其实…

Centos7安装Nginx-1.21

一、编译前提&#xff0c;需要安装必要的包 yum install gcc pcre-devel openssl-devel zlib-devel wget -y 二、下载对应的NGINX包 wget http://nginx.org/download/nginx-1.21.0.tar.gz 三、解压nginx tar xf nginx-1.21.0.tar.gz 四、编译并安装nginx到/usr/local/ng…

高中数学立体几何练习题3

用到的基础知识&#xff1a; 1. 2.

C语言中大小写宁母的转化详细讲解

在 C 语言中&#xff0c;可以使用一些函数来实现大小写字母的转换。 toupper() 和 tolower() 函数 这两个函数可以将一个字符转换为大写或小写字母。它们的原型定义在 ctype.h 头文件中&#xff1a; int toupper(int c); int tolower(int c);这两个函数都接受一个字符参数 c…

软件测试过程中出现随机性缺陷,大家是如何处理的?

软件测试是确保软件产品的质量、功能和可靠性的关键过程。然而&#xff0c;测试并不总是完美无缺的&#xff0c;在开发和测试阶段可能会出现缺陷。缺陷是错误、缺陷或偏离软件的预期行为或要求。在本文中&#xff0c;我们将探讨软件测试中缺陷的常见类型和原因&#xff0c;以及…

netstat是一个常用的网络工具,用于显示和分析网络连接、路由表以及网络接口等信息。

netstat 是一个常用的网络工具&#xff0c;用于显示和分析网络连接、路由表以及网络接口等信息。 它可以提供关于网络活动的实时统计数据&#xff0c;包括正在监听的端口、已建立的连接、网络接口的状态等。 使用 netstat 命令可以列出当前系统中的网络连接情况。以下是一些常…

AutoCAD .NET 层次结构介绍

AutoCAD .NET API 提供了一种面向对象的编程接口&#xff0c;通过它可以与AutoCAD进行深度集成和自定义功能开发。以下是基于.NET框架下AutoCAD对象层次结构的基本介绍&#xff1a; Autodesk.AutoCAD.ApplicationServices 命名空间 根对象&#xff0c;代表运行中的AutoCAD应用程…

centos 7 部署若依前后端分离项目

目录 一、新建数据库 二、修改需求配置 1.修改数据库连接 2.修改Redis连接信息 3.文件路径 4.日志存储路径调整 三、编译后端项目 四、编译前端项目 1.上传项目 2.安装依赖 3.构建生产环境 五、项目部署 1.创建目录 2.后端文件上传 3. 前端文件上传 六、服务启…

一文彻底搞懂Java中ArrayList和LinkedList 区别

文章目录 1、数据结构2、插入和删除3、随机访问4、内存占用5、适用场景6、总结7、选择建议8、关于 ArrayList 和 LinkedList 的常见问题 1、数据结构 ArrayList&#xff1a;基于数组实现&#xff0c;元素在内存中是连续存储的。LinkedList&#xff1a;基于链表实现&#xff0c…

第二证券:苹果Vision Pro出货在即 固态电池产业化前景渐明

sion Pro即将于2月2日正式在美国商场开始交给&#xff0c;苹果美国官网释出了Vision Pro的详细参数&#xff0c;与发布会介绍根本一致&#xff0c;依靠总计12个摄像头、5种传感器、职业顶尖的单眼4K分辨率Micro-OLED显示屏、M2与R1芯片&#xff0c;完成了当时商场上独一无二的沉…

有关使用Lombok@Builder注解构建对象返回为空

目录 问题 原因 解决方案 问题 使用lombokBuilder注解构建对象返回结果为空 原因 Builder注解底层调用setter等方法赋值&#xff0c;你如果没加Data注解就赋值不上&#xff0c;idea也不会错误警示&#xff0c;运行也不会抛出异常&#xff0c;这个平时不注意漏掉这个点还真…

SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage——论文泛读

FAST 2021 Paper 论文阅读笔记整理 问题 键值&#xff08;KV&#xff09;存储支持许多关键的应用和服务。它们在内存中执行快速处理&#xff0c;但通常受到I/O性能的限制。最近出现的高速NVMe SSD推动了新KV系统设计&#xff0c;以利用其低延迟和高带宽。 挑战 当前基于LSM…

gorm+mysql查询/修改json列相关操作汇总

目录 具体操作 1&#xff0c;查询JSON段落指定key的值是否有等于value的 或 指定keyvalue的数据记录 2&#xff0c;查询JSON段落中price>19的记录 3&#xff0c;查询JSON段中key为k0的记录 4、JSON段落中提取指定键值对到指定结构 5&#xff0c;查询JSON数组是否包含…