深度探索C++对象模型1

深度探索C++对象模型【第三章1】 1:编译器会为每一个空class安插一个char,使得这个class的两个objects对象在内存中配置独一无二的内存地址。这就解释了空类的大小为何为1(即使该类为派生类,也需要为其安插一个char来区分其对象)。(传统意义上这个char会被放到class 的尾端) 2:class 的大小主要和以下三种因素相关: 虚拟机制带来的负担:一个指针,或是指向一个相关的vbtl,或是一个虚基类 阅读详情
 
读完这一章使我想到了一个很久以前看到的一个笑话,编写一个HELLO WORLD的程序,随着水平和职务的不一样,程序代码也随着变化。当初看时完全当作笑话来看,现在看来写此笑话的人水平不一般。如果要使你的代码能够最大限度的适应不同的运行环境,和最大限度的复用,则在设计和编写的过程中需要考虑的问题很多,因此代码已变的不在具有C语言的简洁,高效。而牺牲了这些优势换来的是更好的封装。当然如果你只是要打印Hello World则不必这样做了。

  以C++的思维方式解决问题,对于对C语言已经很熟悉的人来说会很不能适应。需要一段时间来适应,不然会将代码写的似是而非。而且不能邯郸学步,必须从思想上彻底的C++(OO),如果只是依葫芦画瓢,那结果很可能是用C++的语法编写C式的程序。本人曾经犯的典型的低级的错误之一,就是无意识的一个类无限制的扩充,完全没有考虑到类的多层结构(基类-派生类),需要属性或方法便在类中增加,虽然也用到了多态、重载等一些OO的设计方式,但最后这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。并且最致命的是在维护更新时带来得麻烦,需要不断全部编译不说,而且代码在用了大量注释后,在过一段时间读起来也是一件重脑力劳动。及失去了C的简洁清晰和高效,也不完全具备C++的面向对象的特性。这根本不能叫C++程序。(我想有时间重写一下以前代码也会有很多收获,温故而知新吗)C和C++在编程思想上是相互矛盾的。这也就是说如果你想学C++,完全可以不学C,只需要一本好书和一个不太笨的大脑再加上努力就可以了,如果你已有C的经验在一定的情况下反而会捣乱。

  本章是对对象模型的一个大略浏览。既然我们选择了C++而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。我们必须学会C++的思考方式。采用抽象数据类型或用一个多层的class体系对数据以及数据处理函数进行封装,只有摆脱C程序的使用全局数据的惯性,才能充分发挥出C++对象模型的强大威力。

  在C++中有两种数据成员static和nonstatic,以及三种成员函数static、nonstatic和virtual。C++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。static和nonstatic成员函数被放在类对象之外。而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。

  我们设计的每一个类几乎都要有一个或多个构造函数、析构函数和一个Assignment运算符。他们的作用是构造函数产生一个新的对象并确定它被初始化。析构函数销毁一个对象并确定它已经被适当的清理(避免出现内存泄露的问题),Assignment运算符给对象一个新值。

  这是第一章的第一部分,由于雷神最近几天在做模式小组的主页,时间周转不开了。本想写完整个一章再发,考虑一下还是先发一部分吧。原因有2。1、第一章的后半部可能又要拖上10天半个月的。2、笔记实在难写,我不愿意将笔记做成将书上的重点再抄一边,而是喜欢尽量将自己的理解描述出来,谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生。所以本着对大家和自己负责的态度,雷神准备再看它3遍在说。突然发现自己的C++还差的很远,好可怕呀。


从 AccessControl.authorizationCheck 读懂 ABAP CDS 访问控制:默认策略、取舍边界与一线项目实战 摘要: 本文深入解析ABAP CDS视图中@AccessControl.authorizationCheck注解的核心功能与工程实践。该注解通过DCL角色实现行级数据过滤,提供三类能力:控制访问生效条件、约束语义一致性及管理特权访问。文章详述四种注解取值(#CHECK、#NOT_REQUIRED、#NOT_ALLOWED、#PRIVILEGED_ONLY)的适用场景与默认行为,并结合采购订单案例演示DCL与PFCG授权的落地步骤。同时指出访问控制的边界问题(如JOIN场景可能绕过过滤),并给出视图层级决策矩 阅读详情

相关推荐

海康工业相机SDK+OpenCV实战:图像采集与Mat格式转换优化指南

本文深入探讨了如何高效利用海康工业相机SDK与OpenCV进行图像采集与处理。重点解析了从相机RawData到OpenCV Mat格式转换的核心优化技巧,包括像素格式匹配、内存零拷贝管理以及彩色图像BGR/RGB转换,旨在解决工业应用中常见的性能瓶颈与内存问题,构建稳定高效的图像处理流程。

weixin_29192211的博客 108

C/C++ 常见编程技巧

一、const char* 和char* 之间的转换 const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据. 1.const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const c...

weixin_34013044的博客 194

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6509

程序设计基础

程序设计基础内存分配与管理内存分配方式 由C/C++编译的程序占用的内存分为以下几个部分栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等。其操作方式类似于数据结构中的栈。堆区(heap):一般由程序员分配释放(malloc/free、new/delete),若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区(stat...

stt2019 1318

数字取证双雄:Passware Kit Forensic 与 ElcomSoft 在实战场景下的能力边界解析

本文深入解析了Passware Kit Forensic与ElcomSoft在数字取证实战中的能力边界,涵盖Windows、macOS、iOS和Android系统的密码恢复与数据提取技术。通过真实案例对比两款工具在硬件加速、分布式计算及云取证等场景下的表现差异,为取证专家提供关键决策参考。特别探讨了密码恢复软件在加密设备突破中的核心作用。

weixin_30342209的博客 399

wxComboBox类的使用方法及示例代码

其中,parent表示该控件的父窗口,ID_COMBOBOX是该控件的ID,用于在事件处理函数中区分不同的控件,"默认选项"是下拉列表框的默认选项,options是wxArrayString类型的数组,用于存储下拉列表框中的选项,style可以指定wxComboBox的样式。wxComboBox是wxWidgets中的一个常用控件,它可以被用来显示一组在下拉列表框中的选项,并允许用户从中选择一个选项。上述就是wxComboBox类的基本使用方法,使用这个控件可以方便地实现下拉列表框的功能。

学习使你进步。 713

VS2017 CLR 编程无法调用方法或函数

本要在做项目的过程中,算法需要使用C++进行编写,但界面需要使用winform,开发环境为 VS 2017。在开发过程中,发现有些方法或函数已经定义了,但是在C#中进行调用时,函数列表中不存在该函数,如图所示:如图所示,虽然 Array函数已经在Utility 中进行了定义,但在 winform 中进行调用时,列表中不存在Array;经观察发现,因为 vector 是C++中的类型,而C#中不存在...

lingtianyulong的专栏 3330

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1071

CreateThread, AfxBeginThread,_beginthread

CreateThread是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)。线程函数定义为:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。但它没有考虑:(1)C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常

xust999的专栏 2183

【AFAC2026金融智能-赛题四】我做了一个疯狂的决定,把Embedding和Reranker全删了

本文介绍了AFAC2026金融智能挑战赛赛道四的解题思路,核心是在500万token的严格限制下实现金融长文本的高效问答。作者通过四步流水线(规划、BM25检索、记忆压缩、LLM推理)优化流程,重点创新在于: 采用零API调用的纯BM25检索,配合多路查询、封面页加权和页面邻接扩展等策略 设计高效的检索算法,从问题中提取专有名词并构建多路查询组合 深入理解评分公式,平衡准确率和token消耗,最终在准确率提升的同时将token消耗从数百万降至百万级 这些创新使方案在严格限制下实现了性能突破,展示了在资源受限

227

zemax 如何编译用户自定义DLL(含VS下载教程)

zemax 如何编译用户自定义DLL(含VS下载教程)

weixin_72050316的博客 492

深度探索C++对象模型 第1章 关于对象

一、三、四章第1章 关于对象1.1 c++对象模型三.1 无继承下的C++对象模型**三.2 有继承下的C++对象模型****四 对象模型如何影响程序**1.2 关键词所带来的差异1.3 对象的差异欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U

沟沟沟的博客 221

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度探索C++对象模型 第1章

以下有三种数据类型(也还可以包含第四种模版化的数据类型)       从struct Point3d到class Point3d加上封装后的布局成本增加了多少? 答案是class Point3d并没有增加成本。 三个数据成员直接内含在每一个类对象之中,就像C struct的情况一样。成员函数虽然含在class的声明之中,但不出现在每个对象中。每个非内联成员函数只会诞生一个函数实体。

王者之殿 588

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度探索C++对象模型第1章 关于对象

一、何为C++对象模型? C++对象模型可以概括为以下2部分: 1. 语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等第一部分这里我简单过一下,重点在底层实现机制。 在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数

LIJIWEI0611的博客 293

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度探索C++ 对象模型(1)-三种对象模型的设计

这里写自定义目录标题c++对象模型(1)类的成员Questions:虚函数表对象模型 c++对象模型(1) 类的成员 数据成员 . Static . Nonstatic 成员函数 . Static . Nonstatic . virtual Questions: C++封装带来的布局成本是多大? 由空类组成的继承层次中,每个类对象的大小是多大? 虚函数表 含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表vptr 每一个类为每一个virtual函数产生一个指针,放在表格中,这个表格就是虚

thefist的专栏 658

深度探索C++对象模型 1

第一章:关于对象   加上封装后的布局: 如果C++class和C struct含有相同数据成员,那么C++class并没有增加成本。因为,C++ class中的成员函数不出现在object中(non-inline 成员函数只会诞生一个实例,而inline函数则会在调用该C++ Class的文件模块中产生一个实例),所以C++支持的封装性质并未带来任何空间或执行期的不良后果。   C++

walkerkalr的专栏 1239

深度探索C++对象模型笔记 [1] 关于对象

本文主要基于Stanley.B.Lippman的《Inside the C++ Object Model》(侯捷译)而做的一些归纳(文字大多按照译文,进行了适当精简) 前言 在C中,“数据”和“处理数据的操作(函数)”是分开声明的,也就是说,语言本身并没有支持“数据和函数之间”的关联性。这种程序写法称作“程序性的(procedural)”,即所谓面向过程。 抽象数据...

Alfeim的博客 495

第1章读书笔记——深度探索c++对象模型

文章目录第1章 关于对象1.1 c++对象模式1.2**关键词带来的差异**1.3对象的差异 第1章 关于对象 1.1 c++对象模式 c++中有两种class data members: static和nonstatic,三种class member functions: static,nonstatic和virtual 对下面代码class point声明: class Point{ public: Point(float xval); virtual ~Point(); .

风源- 902

《深度探索C++对象模型》读书笔记1:引言,《深度探索C++对象模型》值得一读

《深度探索C++对象模型》为我们揭开了C++语言封装背后的技术细节,读完之后有一种“醍醐灌顶”的感觉。我想把自己的心得书写成文,一方面跟朋友们分享C++底层的奥秘,另一方面也是对C++的一次复习和总结。我会尽量用浅显的语言让朋友们在读完这系列文章之后,能够对《深度探索C++对象模型》有一个比较全面的认识。当然,如果您有什么不懂的地方也可以留言以交流。在这个系列的文章中,我会从一个初学者的角

宁静致远 1105

《深度探索C++对象模型》chapter1:关于对象

目录前言什么是C++对象模型?1 关于对象1.0 加上封装后的布局成本1.1 C++对象模式1.1.1 派生类如何模塑其基类实例?1.2 C++中的多态1.3 需要多少内存以表现一个class object?1.4 class的object布局和pointer布局1.5 OO与OB 前言 什么是C++对象模型? 语言中直接支持面向对象程序设计的部分 对于各种支持的底层实现机制 1 关于对象 1.0 加上封装后的布局成本 成员函数不占用类对象的内存空间 一个类对象至少占用1个字节的内存空间 成

weixin_42323999的博客 222

深度探索C++对象模型(1)

zzy5177的专栏 187

【深度探索C++对象模型】(1)关于对象

哎 再开新坑,希望19年能把开的这几个坑都填上。 class : 类 class object : 类对象 1.1 C++对象模型 简单来说,C++对象模型的实例的组成包括下面几个部分: Nonstatic data members与**virtual pointer(vptr)**储存在class object内 Static data members、Static functions mem...

RaKiRaKiRa的博客 289

《深度探索C++对象模型》1

C++对象模型: 多重继承模型示意: 第二章:构造函数 语意学 基类和派生类: Bear yogi; ZooAnimal franny=yogi; 在这里,很容易理解合成的copy构造函数将vptr指向基类的虚函数表,不然不仅造成数据切割(sliced),函数调用也混乱了。 返回值的初始化: 在下述四种情况下必须使用成员初始...

weixin_30687051的博客 84

深度探索c++对象模型(1):关于对象

一、简单对象模型 class Point { public: Point( float xval ); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print( ostream &os ) const; float _x; static int _point_count;

ehuangdan5864的博客 137
上一篇: c++面向对象编程必备“良方”(欢迎大家来补充!)
下一篇: 深度探索C++对象模型2
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值