您的位置:首页 > 编程语言 > C语言/C++

《深度探索C++对象模型》第五章Semantics of Construction,Destruction, and Copy_学习笔记

2011-12-15 15:32 337 查看
Presence of a Pure Virtual Function

可以静态调用纯虚函数,而不能通过虚拟机制调用。在调用时,如果你未定义该纯虚函数,则可以通过编译阶段,但在链接阶段产生错误。

#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;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: