Inside The C++ Object Model - 04 C++对象模型的一个简单示例
首先定义一个类X
class X
{
public:
X();
X(const X& x); virtual ~X(); virtual foo();
}
再来一段代码:
X foobar()
{
X xx;
X *px = new X; //foo 是一个虚函数
xx.foo();
px->foo(); delete px;
return xx;
};
以上这个函数中包括了虚函数调用,构造,NRV优化,虚析构等部分。以下代码展示了用C代码描述样子:
//为了避免多次复制,直接将接收返回值的对象作为引用参数传入 void foobar(X &_result)
{
//X xx
//构造 _result
//调用传入对象的构造函数
//_result.X:X()可以理解为调用_result对象的X类中的X函数
_result.X:X(); //X *px = new X;
//这里的_new相当于malloc 是一个单纯的内存分配函数
//然后再对px指向的对象调用默认构造函数
px = _new(sizeof(X))
if(px != )
px->X::X() //xx.foo()
//虽然foo是个虚函数,但是xx.foo是直接通过对象调用的,不需要经过虚函转换,所以类似一般的函数调用,吧对象作为第一个参数直接传入
foo(&_result) //px->foo()
//使用虚函数表进行调用
(*px->vbtl[])(px) //delete px
//_delete相当于free
if(px) {
(*px->vbtl[])(px);
_delete(px); //由于做了NRV,所以不需要进行额外的创建匿名对象
return;
}
Inside The C++ Object Model - 04 C++对象模型的一个简单示例的更多相关文章
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...
- BOM (Browser Object Model) 浏览器对象模型
l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...
- JS--dom对象:document object model文档对象模型
dom对象:document object model文档对象模型 文档:超文本标记文档 html xml 对象:提供了属性和方法 模型:使用属性和方法操作超文本标记性文档 可以使用js里面的DOM提 ...
- C++学习书籍推荐《Inside the C++ Object Model》下载
百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...
- javascript之DOM(Document Object Model) 文档对象模型
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Inside The C++ Object Model(二)
============================================================================2-0. 关键字explicit被引入C++,提 ...
- inside the C++ Object model总结
一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...
- Inside The C++ Object Model - 03
object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...
- Inside The C++ Object Model(三)
============================================================================3-0. 类所占的内存大小受到三个因素的影响:( ...
随机推荐
- UIkit框架之UIDatePicker
1.继承链:UIcontrol:UIview:UIResponder:NSOobject 2.和uidatepicker相关联的触发事件是 UIControlEventValueChanged,当使用 ...
- laravel_5《数据库迁移》
Laravel鼓励敏捷.迭代的开发方式,我们没指望在第一次就获得所有正确的.相反,我们编写代码.测试和与我们的最终用户进行交互,并完善我们的理解. 对于工作,我们需要一个配套的实践集.我们使用像sub ...
- swiper的使用
最近要用html5制作可以一屏一屏向上滑动的页面,发现大家使用swiper插件的较多,所以试了试,发现做出来的效果还不错,喜欢的朋友可以参考一下自己动手做啦. 1.首先我们要引入4个文件: <h ...
- 如何快速编写Vim语法高亮文件
这里有一份中文的入门文档,但是太长了,不想读,所以有本文 最快的办法,就是找一个语法相近的语法高亮文件,稍微改一下 自己从头写的话,首先搞定关键字: syntax case match "是 ...
- js常见函数汇总
/** * 隐藏元素 * @param {String} elem */ function hide(elem){ var curDisplay = getStyle(elem, 'di ...
- Centos7.2 Systemd 方式编译 Mysql5.7.11
导读 MySQL 5.7 版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU. ...
- 关于只针对ie7浏览器的css问题
如代码: .centerDiv .search_k2{ margin-left: 18px; *margin-left: 9px; margin-top: 10px; height: 40px;} 中 ...
- mm/swap
/* * linux/mm/swap.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * This file should contain ...
- 黑马程序员——JAVA基础之标准输入输出流
------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...
- DuoCode测试
http://duoco.de/ DuoCode 只能引用自己编译的DLL,不能引用外部DLL.这么做可以保证”代码编得过,就一定能跑“. SharpKit 遇到过这样的问题.在代码中使用了 list ...