C++基础——类与对象的讲解2

2023-11-01

目录

一.类域

 二.计算类的大小

 类存储方式一:

        类中包含各个成员(包括函数在内)。

类存储方式二:

类的存储方式三:

练习题:

 三.C++结构内存对齐规则


一.类域

         其实类也是个域,拥有一对花括号,它与我们之前学习的命名空间域有相似之处,但也大有不同。命名空间域是一堵墙,需要权限才能去打开,但只要有了权限,里面的一切就都能访问到;而类域也可以认为是一堵墙,但它是一堵虚拟墙,需要实例化对象后才能访问其中一部分内容(会有访问限定修饰符),如下图代码所示:

//命名空间域
namespace bit {
	int x = 100;
	double y = 15.93;
	int Add(int j, int i) {
		return i + j;
	}
}

int main() {
	bit::x = 99;
	bit::y = 3.14;
	int a = 1, b = 2;
	bit::Add(a, b);
	cout << "x:"<<bit::x << endl;
	cout << "x:" << bit::y << endl;
	cout << "Add:" << bit::Add(a,b) << endl;
	return 0;
}

 

而类域代码:

//类域
class ListNode {
public:
	void ListInit(int capa) {

	}
	void ListPush(int x) {

	}
private:
	int* _a;
	int _top;
	int _capacity;
};

int main(){
    ListNode lst1;
	lst1.ListInit(4);
	lst1.ListPush(1);
	lst1.ListPush(2);

    }

对于类必须创建实例化对象,否则,不允许访问任何成员:

 

 二.计算类的大小

如下图代码所示:一个类中既包含了函数,又包含了成员变量,该如何计算类的存储大小呢?

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

int main() {
	cout << sizeof(A) << endl;
	A aa;
	cout << sizeof(aa) << endl;
	return 0;
}

 

答案为什么都是1呢?这就要提到类存储的三种方式了。 

 类存储方式一:

        类中包含各个成员(包括函数在内)。

       这种每个对象中成员变量是不同的,成员函数也不同。

 

类存储方式二:

表明类中只存储类成员变量,对于成员函数则是使用一个地址去指向它们。

        当使用类A实例化两个对象时,让两个对象都调用PrintA();会发现它们调用的是同一个函数,连地址都相同。

类的存储方式三:

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

 

        这三种方式是官方一步步改进出来的,最终将方式三保留了下来, 对于第一种方式来说,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。 对于第二种方式,举个栗子来讲:好比盖小区,小区内造了5栋楼,100套房子,每一套房子的主人不同,厕所厨房都是独立的,而那些锻炼器材,例如健身房,游泳池又不能每家都有,所以开辟了一个公共区域(成员函数),但是每个房子的主人会获得一把去这里的钥匙(给地址),让每家的人都可以去;对于第三种方式来说,是把成员函数放在一个公共区域,一看就可以找到,不需要给每家人钥匙,是没有锁的,很方便。

        所以编译器就是使用的第三种存储方式,这也印证了前面例题中为什么类和类对象的大小都是1了,只有char_a被存储进去了。

练习题:


// 类中仅有成员函数
class A2 {
public:
   void f2() {}
};

// 类中什么都没有---空类
class A3
{};

int main() {
	cout << sizeof(A2) << endl;
	cout << sizeof(A3) << endl;
	return 0;
}

 系统为什么给A2,A3各分配一个字节?

        只是用来占位,不存储有效数据,只是标识对象存在!

 

 三.C++结构内存对齐规则

因为C++兼容C语言,所以它的内存对齐与C完全一样。

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

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8

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

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础——类与对象的讲解2 的相关文章

随机推荐

  • Adaboost算法和MATLAB实现

    一 AdaBoost简介 Boosting 也称为增强学习或提升法 是一种重要的集成学习技术 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器 这在直接构造强学习器非常困难的情况下 为学习算法的设计提供了一种有效的新思路和
  • IT职场难以“老有所终” 谁之过

    还有谁可能在一家企业 从一而终 吗 有资料显示 以往各大公司的裁员 辞退员工行为中 老员工都是更大的受害者 只是 现在华为的 万人辞职 行动公开 直接地把 矛头 指向了老员工 再次触及到了IT职场上老员工的去从难题 一位在华为工作11年的老
  • 英语词汇表

    A a an art 一 个 件 abandon v 放弃 抛弃 ability n 能力 才能 able a 能够 有能力的 abnormal a 不正常的 aboard prep 在 或上 船 飞机 火车等 abolish v 废除 a
  • 自连接表 ——《二级关注者》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • windows环境python2.7安装pyinstaller

    作者环境 windows10 python2 7 直接使用pip install pyinstaller安装会报错 一开始是报pip版本过低 按照提示命令升级pip版本后又提示以下错误 到这里请跳到下面第5点尝试操作 如果不行 再回到这里阅
  • 正确实现 IDisposable 接口

    正确实现 IDisposable NET中用于释放对象资源的接口是IDisposable 但是这个接口的实现还是比较有讲究的 此外还有Finalize和Close两个函数 MSDN建议按照下面的模式实现IDisposable接口 NET的对
  • MapReduce(一):FileInputFormat源码解析

    来源 https www bilibili com video av36033875 from search seid 12700632591522714293 FileInputFormat切片机制 1 job提交流程源码详解 主要代码流
  • 虚拟内存有什么用

    虚拟内存是什么 虚拟内存别称虚拟存储器 Virtual Memory 电脑中所运行的程序均需经由内存执行 若执行的程序占用内存很大或很多 则会导致内存消耗殆尽 为解决该问题 Windows中运用了虚拟内存技术 即匀出一部分硬盘空间来充当内存
  • 【threejs效果:模型炸开】以钢铁侠obj模型为例

    1 效果如下 2 基本原理 首先加载一个obj模型 然后遍历obj模型的所有children mesh 按一定比例改变每个子mesh的中心点位置即可 爆炸代码 function modelExplode num 模型世界中心 var mod
  • 游戏资源贴

    转载自 http www gamedev net community forums topic asp topic id 324643 Ok so the point of this thread is simple to list as
  • Linux 6.6 中的 SELinux 删除了 NSA 的引用

    导读 Security Enhanced Linux SELinux 二十年来一直是主线内核的一部分 它提供了一个实现访问控制安全策略的模块 现在广泛用于增强生产 Linux 服务器和其他系统的安全性 长期接触 Linux 的人可能不知道
  • Java应用程序安全框架

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • openGL之API学习(八十四)glGetObjectLabel

    获取命名空间对象的标签 打标签由函数glObjectLabel执行 void glGetObjectLabel GLenum identifier GLuint name GLsizei bufSize GLsizei length cha
  • HTTP反爬困境

    尊敬的程序员朋友们 大家好 今天我要和您分享一篇关于解决反爬困境的文章 在网络爬虫的时代 许多网站采取了反爬措施来保护自己的数据资源 然而 作为程序员 我们有着聪明才智和技术能力 可以应对这些困境并确保数据的安全性 本文将重点介绍如何通过H
  • 如何把简单的事情一次做对?

    在工作中领导最讨厌的人就是总把简单的事情做错的下属 在绝大多数人不会犯错的地方犯错 在领导眼中会判定为是基本素质问题 是不可原谅的 如果组织要裁员 那优先裁掉的就是哪些总是犯低级错误的人 那如何确保能够把简单的事情一次做对 提升自己的职场竞
  • 好用用的linux 监控命令

    1 dstat 命令 参考http www cnblogs com vincent hv p 3358194 html dstat的基本使用 2 1 dstat的默认选项 与许多命令一样 dstat命令有默认选项 执行dstat命令不加任何
  • Angular_与服务器通讯(Websocket通讯)

    在上一篇文章中 我们创建了server服务 在那个项目中我们继续添加websocket服务 npm install ws save 然后安装types格式的 npm install types ws save dev 实现场景 编写服务端
  • “终于懂了” 系列:组件化框架 ARouter 完全解析(二)APT技术

    ARouter系列文章 终于懂了 系列 组件化框架 ARouter 完全解析 一 原理全解 终于懂了 系列 组件化框架 ARouter 完全解析 二 APT 帮助类生成 终于懂了 系列 组件化框架 ARouter 完全解析 二 AGP Tr
  • 物理服务器向虚拟化无缝对接,服务器虚拟化下的网络变迁

    一个风起 云 涌的IT时代 展现的是一种全新的动态IT基础设施 和传统的IT基础设施相比 虚拟化成为目前整个IT基础架构的变革性创新技术 对计算 存储 网络都产生了长远的影响 在数据中心等场景中引入虚拟化技术之后 服务器接入网络的位置往往是
  • C++基础——类与对象的讲解2

    目录 一 类域 二 计算类的大小 类存储方式一 类中包含各个成员 包括函数在内 类存储方式二 类的存储方式三 练习题 三 C 结构内存对齐规则 一 类域 其实类也是个域 拥有一对花括号 它与我们之前学习的命名空间域有相似之处 但也大有不同