[读书笔记] Inside C++ Object笔记(第4章: Function语意学)

[Happy DSA] 图像的contour trace算法C++实现 问题提出: 给定一个二维图像,基于某个threshold,来提取contours。 在图形图像学中,这个问题有比较好的解决方案,google "coutour trace",可以得到以下2个比较好的参考文献: 1. http://en.wikipedia.org/wiki/Moore_neighborhood 2. http://www.imageprocessingplace.com/d 阅读详情
1. 调用方式
经由一个class object调用一个virtual function,这种操作应该总是被编译器像对待一般的nonstatic member function一样的加以决议.
// Point3d obj
obj.normalize();

virtual void normalize() {... }

2. static member function
((Point3d*)0)->object_count(); // object_count是一个静态成员函数

实际上,只有当一个或多个nonstatic data member在member function中直接存取时,才需要class object。class object提供了this 指针给这种形式的函数调用使用。如果在member function没有存取任何数据成员,那么也就没必要用class object来调用这个成员函数了。
static member function的特性就是它没有this指针。所以就导致以下的特性:
1) 它不能存取class中的nonstatic members
2)它不能被声明为const,volatile或virtual
3)它不需要经由class object才被调用
如果取一个static member function的地址,获得的将是其在内存中位置,也就是它的地址。由于它并没有this指针,所以其地址的类型并不是一个“指向class member function的指针“。而是一个”nonmember 函数指针“。譬如:
&Point3d::object_count();
会得到一个数值,类型是
unsigned int (*)();
而不是:
unsigned int (Point3d::*)();

3. 多态
在C++中,多态表示“以一个pulibc base class的指针(或reference),寻址出一个derived class object"的意思。
关键词class和struct并不能帮助我们决定类是否有多态性,同时也没有导入polymorphic之类的新关键词,故识别一个class是否多态的唯一的方法就是看它是否有virtual function。如果有,则需要增加额外的执行期信息。
virtual function table中应该有什么样的内容呢?
1) 这个class所定义的函数实体。它会改写一个可能存在的base class virtual function函数实体。
2)继承自base class的函数实体。这是在derived class决定不改写virtual function时才会出现的情况。
3)一个pure_virtual_called()函数实体,它既可以扮演pure virtual function的空间保卫者角色,也可以当作执行期异常处理函数。

每一个virtual function都被指派一个固定的索引值,这个索引在整个继承体系中保持与特定的virtual function的关联。
由最上层的基类的virtual function开始确定索引值,子类如果重写某个virtual function,则索引值不变,只是更改对应slot中的函数地址;子类如果增加更多的索引值,则append更多的slot。第0个slot存储是当前类的typeinfo。

4. nonstatic member function
取一个nonstatic member function的地址,如果该函数是nonvirtual,则得到的结果是它在内存中真正的地址。然而这个值是不完全的,它也需要被绑定于某个class object的地址上,才能够通过它调用该函数。所有的nonstatic member functions都需要对象的地址(强调,程序可否正常运行依赖于this指针在函数内部有没被用来获取它内部数据)。

如果这个nonstatic member function是virtual,处理上会有些那些不一样的地方呢?
float (Point::*pmf)() = &Point::z;
Point* ptr = new Point3d;
如果以ptr来调用它的z()函数,我们知道它最终会调用Point3d::z()函数,这是多态所带来的效果。
如果以ptr和pmf间接调用z()函数,仍然能够调用到Point3d::z()函数吗,答案是可以。
面对一个virtual nonstatic member function,其地址在编译时期是未知的(因为虚函数多态调用是在运行期决议的),所能知道的仅是virtual function在其相关之virtual table的索引值。也就是说,对一个virtual function取地址,所能获得的是一个索引值。
所以上面的z()如果是virtual,那么pmf将会是一个索引值。编译器会将其转化为下面类似的式子:
(*ptr->vptr[(int)pmf])(ptr);
如果z()不是virtual,那么调用式子将会是:
(ptr->*pmf)(); => (*pmf)(ptr);

函数模板知识点梳理 函数模板代表一个函数家族。 通常而言,并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的每种类型,都从模板产生一个不同的实体。 关于模板编译,会有2个过程,分别发生在:(请注意VC++与GCC之间的不同) 1. 实例化之前,先检查模板代码本身,查看语法是否正确,在这里会发现错误的语法,如遗漏分号等。 2. 在实例化期间,检查模板代码,查看是否所有的调用都有效 阅读详情

相关推荐

MAS1102量产工具实战指南:从下载到开卡,附固件选择与RDT优化技巧

本文提供MAS1102量产工具的实战指南,涵盖从工具下载、短接识别到开卡操作的全过程。重点解析了固件选择策略与RDT优化技巧,帮助用户成功修复基于联芸MAS1102主控的固态硬盘,解决常见开卡错误并提升SSD性能与稳定性。

c2d3e4f的博客 2200

《Inside C++ Object 》 阅读笔记(2),看《Inside C++ Object 》的作用

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12&quo

webcenterol 131

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7137

Inside C++ object model: Object lessons

Inside C++ object model: Object lessons

m0_61115872的博客 328

300个fpga练手项目推荐

• 按键设置BPM,LED和蜂鸣器同步打拍(支持4/4、3/4拍)• 例:先实现DDR3控制器(基础),再构建视频处理流水线(集成)◦ 驱动小型e-Paper显示日期/时间(SPI接口,静态刷新)◦ 音频输入经FFT后,用LED柱状显示频率能量(8频段简化)◦ 通过HC-05模块接收手机指令,控制电机方向(前进/后退)• 随机点亮LED,用按钮响应,数码管显示反应时间(毫秒级)• 8个LED旋转闪烁,按钮停止后显示中奖编号(带减速动画)• 用4方向按键输入手势(如→→←↑),正确后点亮绿色LED。

qq_62784677的博客 7640

华为防火墙介绍和原理,配置详细解析

在出向外网的流量中,我们使用默认路由来指定默认的出口,并且使用nat地址转换,而在外网中,我们使用ISIS协议来进行路由的学习和更新,让外网可以访问到dmz非军事化区域的server1服务器。并进行NAT转换,实现了内部IP地址和外部IP地址之间的映射,以便内部网络可以与外部网络进行通信。网络地址转换(NAT):防火墙可实现网络地址转换,将内部私有IP地址转换成公共IP地址,以隐藏网络拓扑结构,增加网络安全性。确定安全需求:根据企业的安全需求和策略,确定防火墙的配置目标和规则。

外游者 5098

Inside C++ Object Model 之 对象的构造

一。 简单对象的构造    略。二。 继承体系下对象的构造 构造virtual base class 构造base class 设置vptr 展开initial list 中的代码 用户书写与constructor中的代码

神奇的木头 532

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

读书笔记《Inside the C++ Object Model》:关于对象

在C++中,有两种class data members:static和nonstatic,以及三种class member functions:static,nonstatic和virtual。 C++对象模型(The C++ Object Model) Nonstatic data members被配置于每一个class object之内,static data members则被存放在个别

Do-Program的专栏 334

深度学习技巧应用26-CNN中多种注意力机制的嵌入方法,终于搞懂注意力机制了

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用26-CNN中多种注意力机制的嵌入方法,终于搞懂注意力机制了。CNN是一种能够有效处理图像和其他二维数据的深度学习模型。在传统的CNN中,每个卷积核都会对输入的所有位置进行相同的操作,这可能导致网络无法针对特定区域或特征进行更加关注和重点处理。 注意力机制被引入卷积神经网络中,旨在使网络能够自动地学习和聚焦于输入中的重要区域或特征。通过引入注意力机制,可以增强网络对不同区域或特征的关注度,提取更有意义和相关的特征,从而提高模型的性能和表达能力。

微学AI的博客 3313

基于STM32、HAL库的MCP4651-503E/ST数字电位器驱动程序设计

@param channel: 通道 (0: A通道, 1: B通道)* @param channel: 通道 (0: A通道, 1: B通道)// SPI1 SCK/MISO/MOSI引脚配置。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hspi: SPI句柄。

corlin6688的博客 136

《深度探索C++对象模型》 读书笔记:第四章 Function 语意学

4.1Member的各种调用方式 Nonstatic Member Functions(非静态成员函数) C++的设计准则之一就是:nonstatic member function 至少必须和一般的nonmember function有相同的效率 名称的特殊处理 一般而言,member的名称前面会被加上class的明后才能,形成独一无二的命名,也就是mangling手法。对于member...

junya_zhang的博客 385

云端全自动AI漫剧生成工作流:从模型选型到完整实现

本文提出了一套云端全自动AI漫剧生成工作流解决方案,旨在解决传统漫剧制作效率低下的问题。该系统采用"编排引擎+模型矩阵"架构,通过集成大语言模型、图像生成、视频合成等技术,实现从剧本输入到成片输出的全流程自动化。 核心内容包括: 模型选型方案:剧本解析采用DeepSeek-V3/GPT-4o,图像生成使用DALL-E 3,视频合成选用Stable Video Diffusion,语音合成采用MiniMax TTS 系统架构设计:基于Celery分布式任务队列的编排层,分解任务至各功能模块

huanghm88的专栏 642

《inside the c++ object model》读书笔记 之四 Function 语意学

4.1 Member 的各种调用方式:1)nonstatic member function:...C++的设计准则之一就是:nonstatic member function至少必须和一般的农member function 有相同的效率. 实际上member function被内化为nonmember的形式.过程如下: a)改写函数的signature(函数的原型)以安插一个额外的参数到me...

weixin_30455067的博客 117

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Inside the C++ Object Model 读书笔记(七)

Templates Originally viewed as a support for container classes such as Lists and Arrays, templates are now the generic programming (the Standard Template Library). attribute mix-in where, for example...

wangjing09的专栏 284

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

读书笔记《Inside the C++ Object Model》:Copy Constructor的构造操作

有三种情况,会以一个object的内容作为另一个class object的初值。最明显的一种情况当然就是对一个object做显示的初始化操作,另两种情况是当object被当做参数交给某个函数时,以及当函数传回一个class object时。 如果class没有提供一个explicit copy constructor又当如何? 当class object以“相同class的另一个object”

Do-Program的专栏 287

非类型模板参数知识点梳理

对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。 1. 非类型的类模板 template class Stack { private: T elems[MAXSIZE]; ... }; template Stack::Stack() : numElems(0) { } 2. 非类型的函数模板参数 template T addValue(T

zeroom的技术专栏 5143

boost::assign的用法浅析

在boost中看到这样的代码: #include // for 'operator+=()' #include ; using namespace std; using namespace boost::assign; // bring 'operator+=()' into scope { vector values; values += 1,2,3,4,5,6,7

zeroom的技术专栏 4081

[Happy Coding] 函数返回数组指针和数组引用

在boost::array中看到这样的代码: template T(&get_c_array(boost::array& arg))[N] { return arg.elems; } // Const version. template const T(&get_c_array(const boost::a

zeroom的技术专栏 2430

[Effective WX] 理解wxWindow中增加和去除/销毁子窗口的过程

wxWindow中增加和去除/销毁子窗口的过程: a) 增加一个子窗口 void wxWindowBase::AddChild(wxWindowBase *child) { wxCHECK_RET( child, wxT("can't add a NULL child") ); // this should never happen and it will lead to

zeroom的技术专栏 2283

[Happy Coding] fprintf 不正确调用惹的祸

我们都知道C语言标准库操作文件写有一个函数叫做fprintf,用来写出字符串到文件里。这个函数如果不特别注意,会给我们带来很大的麻烦。 比如下面的代码段: const char* outstring = "xxxxx"; FILE* outfileH = fopen("test.txt", "w"); if (!outfileH) { return false; } fprint

zeroom的技术专栏 2011

[Happy Coding] 只能new不能delete的基类实现方法

1. 问题提出 定义一个类,客户端只能new不能delete,但是要求这个类能够被继承。 2. 问题分析 客户端代码能够new一个类实例,说明这个类提供了对应的public访问域的构造函数,不能delete它,说明这个类没有提供public访问域的析构函数。也就是说,析构函数要么是在protected访问域中,要么是在private访问域中。但是要求这个类能够被继承,至少说明析构函数

zeroom的技术专栏 1772

[读书笔记] Inside C++ Object笔记(第5章: 关于ctor/dtor/copy-ctor/op=)

1. typedef struct {     float x, y, z; } Point; 编译器并不会产生那个trivial的函数(ctor/dtor/copy-ctor/assign-op),因为它会认为它是一个POD数据结构,程序的行为跟C中的一样。 注意,即使我们往里面增加有参数的构造函数,其它函数也不会被编译器构造出来。因为它们都是trivial的。 2. C++

zeroom的技术专栏 1659

一些模板术语

1. “类模板”还是“模板类” 在C++中,类和联合(union)都被称为类类型,如果不加额外的限定,我们通常所说的“类”是指:用关键字class/struct引入的类类型。需要特别说明的是,类类型包括联合,而“类”不包括联合。 类模板:该类是一个模板那,它代表的是整个类家族的参数化描述; 模板类:a)作为类模板的同义词;b)从模板产生的类。 2. 声明和定义 声明是一种C++构

zeroom的技术专栏 1334

[Effective WX] wxPropertyGrid遇上wxWS_EX_VALIDATE_RECURSIVELY产生的BUG

对于wxWidget的第三方库wxPropertyGrid,客户端代码实例化一个wxPropertyGrid时有时会发生CRASH。 简单的说,就是下面的代码行在某种情况下会CRASH: wxPropertyGrid* pPG = new wxPropertyGrid(pParentWin, wxID_ANY); 那么到底是在哪种情况下呢? 编写了一个简单的测试代码,跟踪调试发现,C

zeroom的技术专栏 1311

[Happy Coding] delete p;而不是delete [] p; 真的会导致内存泄漏吗?

给定下面的C++代码片段: class A { public: int m_data[10]; }; A* pA = new A[20]; delete pA; 我们知道这里应该用delete [] pA;,但是delete pA;真的会导致内存泄漏吗? 要回答这个问题,我们得从delete pA;和delete [] pA;之间的区别说起。 delete 和de

zeroom的技术专栏 1131
上一篇: [读书笔记] Inside C++ Object笔记(第5章: 关于ctor/dtor/copy-ctor/op=)
下一篇: [Happy DSA] 删除单链表中任意一个节点的方法
zero_lee
博客等级 码龄21年 94粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值