C++对象模型之 Copy Constructor的建构操作

序言:

在计算机当中, 当一个class object的内容作为另一个class object的初始值的时候, 如果class 设计者没有显示的声明Copy Constructor, 那么编译器将会自动生成Copy Constructor。

那么在这里问题就来了:

1、 在什么情况下会调用Copy Constructor? 

2、在初始化过程中, 是采用位逐次拷贝还是采用成员初始化的方式呢?


在什么情况下会调用Copy Constructor

1、一个明确的class object的内容作为另一个class object的初始值。

2、类的对象本身作为函数的参数(非引用和指针的情况)

3、函数返回值是一个类的对象(如果可能在编译器优化的过程中不做明显调用)[在VS下会出现情况, 但是在dev下不会出现此情况]


位逐次拷贝或成员初始化形式的Copy Constructor

位逐次拷贝Copy Constructor:按照类成员的声明次序, 调用memcpy函数进行拷贝

成员初始化Copy Constructor:按照类成员的声明次序,以此调用起构造函数进行初始化

他们之间的区别:

1、如果类成员中包含指针, 通过位逐次拷贝的新对象的成员指针指向的相同的空间。

2、在虚指针的情况下, 如果是父类和基类之间的构造,很有可能会造成虚指针乱指。


例子如下:

class Myclass{
public:
	//...
private:
	int a;
	char *str;
};
如果是位逐次拷贝的情况下复制构造函数可能合成的伪代码

Myclass ::Myclass(const Myclass & _my){
	//合成的伪码
	 this->a = _my.a;
	 this->str = _my.str;
}
如果是成员初始化的情况下复制构造函数可能合成的伪代码

Myclass ::Myclass(const Myclass & _my){
	//合成的伪码
	this->a.int::int(_my.a);
	this->str = new char[strlen(_my.str) + 1]; 
	memset(this->str, 0, strlen(_my.str) + 1);
	memcpy(this->str,_my.str, sizeof(char) * (strlen(_my.str)));
}

如何使C++不展现出位逐次拷贝

1、该类含有member object, 并且该member object的class中声明了复制构造函数(不管是class设计者声明或者是编译器自动生成的)

2、该类继承与一个有复制构造函数的基类(不管是class设计者声明或者是编译器自动生成的)

3、class 声明了一个或者多个virtual function

4、当class派生自一个继承链, 并且其中有一个或者多个virtual base class



一、编译器如何重新设定virtual table的指针

当class声明了一个或者多个virtual function的时候, 在生成复制构造函数将有两个扩张的操作:

(1)、增加一个virtual function table(vtbl), 内含每一个有作用的virtual function的地址

(2)、将一个指向virtual function table的指针(vptr), 安插在每一个class object内

当我们在类中当中加入virtual function的时候, 那么该类就不表现为位逐次拷贝, 那么编译器将会自动合成复制构造函数来对虚表和虚指针进行初始化。

class ZooAnimal{
public:
	ZooAnimal(){cout << "ZooAnimal Constructor\n";}
	virtual ~ZooAnimal(){cout << "ZooAnimal Destructor\n";}
	virtual void animate(){cout << "ZooAnimal animate\n"; }
	virtual void draw(){cout << "ZooAnimal draw\n"; }
private:
	// member data
};

class Bear:public ZooAnimal{
public:
	Bear(){cout << "Bear Constructor\n";}
	~Bear(){cout << "Bear Destructor\n";}
	void animate(){cout << "Bear animate\n"; }
	void draw(){cout << "Bear draw\n"; }
	virtual void dance(){cout << "Bear dance\n"; }
private:
	// member data
};
当ZooAnimal object 以另一个对象作为初始值, 或者 Bear object以另外一个对象作为初值, 都可以直接考“位逐次拷贝”, 这样是安全的

Bear b1;
Bear b2 = b1;

但是如果执行以下代码, 
Bear b1;
ZooAnimal z1 = b1;
编译器生成的复制构造函数并不会直接拷贝Bear object当中的虚表内容, 会发生切割的行为, 导致ZOoAnimal会明确设定对象object的vptr指向ZOoAnimal  class的virtual table的内容, 而不是直接拷贝游走


二、总结

1、如果一个class 未定义copy constructor函数, 那么编译器将会自动生成---这个说法是错误的

2、Default constructor和Copy Constructor在必要的时候由编译器自动合成。

3、一个class object有两个方式构成复制构造函数: 一种是初始化的方式另一种是assignment重载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值