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


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值