《深度探索C++对象模型》第五章Semantics of Construction,Destruction, and Copy_学习笔记
2011-12-15 15:32
337 查看
Presence of a Pure Virtual Function
可以静态调用纯虚函数,而不能通过虚拟机制调用。在调用时,如果你未定义该纯虚函数,则可以通过编译阶段,但在链接阶段产生错误。
结果为:
。
5.1 “无继承”下的对象构造
对象产生 三种 方式:global、local、heap。
C中,global没有明确定义初始化操作,被视为“临时性的定义”,因此可定义多次,而多个实例被链接器折叠,只剩一个实体,放在data segment中的BSS空间(用于存放未初始化数据)之内。
C++中,global被视为完全定义,即仅限定义一次,而且已初始化。
Abstract Data Type
inline X::X(int x = 0): __x (x) {}将比 x.__x = x; 更高效,因为当函数的activation record被放入initialization list常量就可进入object的内存。
若: X o; // => X o; o.__x = 0; 被扩展成简单的 member_by_member常量指定。
而:X *p = new X; //=> X *p = __new( sizeof (X)); if(p != o) p->X::X( ); 调用默认构造函数。
为继承作准备
若class中含virtual function,则将会增加 vptr ,且引发 class 的代码膨胀作用。
C++Standard要求编译器尽量将nontrivial data members的实际合成操作直到遇到使用场合为止。如: X *p = new X; *p = local;copy assignment operator将在*p = local时才合成。
5.2 继承体系下的对象构造
当执行 T object; 时,将伴随:
1、记录member initialization list中data members初始化操作按声明顺序放进 constructor 函数。
2、如data member object未出现在member initialization list、但有default constructor,则调用该constructor。
3、如有virtual ,则指定适当 vptr。
4、所有base class constrcutor
。
可以静态调用纯虚函数,而不能通过虚拟机制调用。在调用时,如果你未定义该纯虚函数,则可以通过编译阶段,但在链接阶段产生错误。
#include <iostream> class A { public: virtual void vf() const = 0; }; void A::vf() const { std::cout << "virtual void A::vf() const\n"; } class D: public A { public: virtual void vf() const{ this->A::vf(); std::cout << "virtual void B::vf() const\n"; } }; int main(int argc, char* argv[]) { D o; o.vf(); return 0; }
结果为:
。
5.1 “无继承”下的对象构造
对象产生 三种 方式:global、local、heap。
C中,global没有明确定义初始化操作,被视为“临时性的定义”,因此可定义多次,而多个实例被链接器折叠,只剩一个实体,放在data segment中的BSS空间(用于存放未初始化数据)之内。
C++中,global被视为完全定义,即仅限定义一次,而且已初始化。
Abstract Data Type
inline X::X(int x = 0): __x (x) {}将比 x.__x = x; 更高效,因为当函数的activation record被放入initialization list常量就可进入object的内存。
若: X o; // => X o; o.__x = 0; 被扩展成简单的 member_by_member常量指定。
而:X *p = new X; //=> X *p = __new( sizeof (X)); if(p != o) p->X::X( ); 调用默认构造函数。
为继承作准备
若class中含virtual function,则将会增加 vptr ,且引发 class 的代码膨胀作用。
如定义类X: class X { public: X(int x = 0): _x = x {} virtual void vf() const; } 则类X的构造函数,将被如下扩展: X::X(X *this, int x= 0) { this->_vptr_X = vtbl_point; this->_x = x; }
C++Standard要求编译器尽量将nontrivial data members的实际合成操作直到遇到使用场合为止。如: X *p = new X; *p = local;copy assignment operator将在*p = local时才合成。
5.2 继承体系下的对象构造
当执行 T object; 时,将伴随:
1、记录member initialization list中data members初始化操作按声明顺序放进 constructor 函数。
2、如data member object未出现在member initialization list、但有default constructor,则调用该constructor。
3、如有virtual ,则指定适当 vptr。
4、所有base class constrcutor
#include <iostream> using namespace std; class A { public: A& operator= (const A& t) { std::cout << "virtual A& A::operator= (const A& t)" << endl; return *this; } }; class B: virtual public A { }; class C: virtual public A { }; class D: public B, public C { }; int main(int argc, char* argv[]) { D d1, d2; d1 = d2; return 0; }运行结果:
。
相关文章推荐
- 基本语言细节--《深度探索C++对象模型》--(5)Semantics of Construction,Destruction,and Copy-总结点
- Ruby on Rails Tutorial 学习笔记 --第五章 完善布局
- Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy
- Principles of Digital Communications I 学习笔记1-Introduction
- 第五章数组—5.2.4讲学习笔记
- Python编程入门-第五章 函数 -学习笔记
- ≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(十九):SVM
- 李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
- RAM: Recurrent Models of Visual Attention 学习笔记
- Principle of Computing (Python)学习笔记(3) probability +Objects and reference + tic_tac_toe
- 系统架构师学习笔记_第五章(下)
- 流体力学学习笔记1(Two-way of coupling of fluids to rigid and deformable solids and shells)
- Effective C++学习笔记之第五章(3)
- C++Primer学习笔记第五章(5/18)表达式
- (转)系统架构师学习笔记_第五章(上)
- C++ Primer 学习笔记(第五章)
- Inside the C++ Object Model 学习笔记 第五章构造 解构 拷贝语意学
- 《JavaScript 语言精粹》 学习笔记 —— 第五章 继承
- ≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(三)
- Python学习笔记-第五章 条件、循环和其他语句(上)