构造函数语义学——Copy Constructor 的构造操作
前言
在三种情况下,会以一个 object 的内容作为另一个 class object 的初值:
- object明确初始化
class X{...};
X x;
X xx = x;
- object 被当作参数交与某个函数
extern void foo(X x);
void bar(){
X xx;
foo(xx);//作为第一个参数的初值(不明显的初始化)
}
- 函数返回值是一个 class object
X foo_bar(){
X xx;
...
return xx;
}
如果开发者已经明确定义了一个copy constructor 如下:
//copy constructor可以是多参数,其中有一个参数是其class type
X::X(const X& x);
Y::Y(const Y& y);
那么在大部分情况下,当 class object 以另一个同类实体作为初值时,上述 constructor 会被调用,这可能会导致一个暂时性 class object 的产生或程序代码发生改变(或二者都有)。
重新设定 Virtual Table 的指针
编译期间的扩张操作(只要有一个class声明了一个或多个virtual function):
增加一个 virtual function table(vtbl),内含每一个有作用的 virtual function 的地址。
一个指向 virtual function table 的指针(vptr),安插在每个 class object 内。
如果编译器对每个新产生的 class object 的 vptr 不能正确的设置初值,则会出错。因此,当编译器导入 vptr 到 class 中时,该 class 不再展现 bitwise semantics。而是合成一个 copy constructor 来使得 vptr 正确初始化,下面是个例子:
class ZooAnimal{
public:
ZooAnimal();
virtual ~ZooAnimal();
virtual void animate();
virtual void draw();
private:
...//some data
};
class Bear : public ZooAnimal{
public:
Bear();
void animate();
void draw();
private:
...//some data
};
ZooAnimal class object 以另一个 ZooAnimal class object 为初值,或 Bear class object 以另一个 Bear class object 为初值,都可以直接靠 bitwise copy semantics 完成。在这种情况下,vptr保持bitwise copy是安全的。
当一个 base class object 以其 derived class object 内容作初始化操作时,其 vptr 也需要保证安全:
Bear B;
ZooAnimal Z = B;//sliced
显然,Z的 vptr 不应该指向 Bear 的 vtbl,也就是说,Base class 被合成出来的copy constructor会明确设定 object 的 vptr 指向 Base Class 的 vtbl,而非从 rhs 处执行 bitwise copy。
构造函数语义学——Copy Constructor 的构造操作的更多相关文章
- Copy Constructor的构造操作
Copy Constructor的构造操作 有三种情况,会以一个object的内容作为另一个class object的初值: 1. 对一个object做显式的初始化操作 class X{…}; X ...
- 构造函数语义学——Copy Constructor 篇
构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...
- 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作
C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...
- 构造函数语义学——Default Constructor篇
构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...
- Default Constructor的构造操作
Default Constructor的构造操作 C++ Annotated Reference Manual书中的Section 12.1说过:default constructor 只有在编译器需 ...
- 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作
C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...
- C++ 类 复制构造函数 The Copy Constructor
一.复制构造函数的定义 复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性.复制构造函数创建一个新的对象,作为另一个对象的拷贝.复制构造函数只含有一个形参,而且其形参为本类对象的引用.复制构 ...
- 构造函数语义学之Copy Constructor构建操作(2)
二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...
- 构造函数语义学之Copy Constructor构建操作(1)
一.Copy Constructor的构建操作 就像 default constructor 一样,如果class没有申明一个 copy constructor,就会隐含的声明或隐含的定义一个.生成的 ...
随机推荐
- 使用java的循环单向链表解决约瑟夫问题
什么是约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...
- 在github上部署第二个repository
想在github上保存一些平时写的测试程序,所以就建立了一个repository:https://github.com/commshare/testProgram 建立好之后,怎么把本地的代码上传呢. ...
- FastEarth
1 概述 FastEarth(后文简称FE)是自主研发的跨平台三维地理信息可视化协作平台,内置完全自主研发的XDR渲染引擎,无缝对接主流地理信息平台数据.建筑BIM.工厂PIM以及多种三 ...
- Docker 为非root用户授权
Docker 为非root用户授权: 当运行docker pull busybox时候,会提示sky用户无法调用docker. 那么应该把sky用户加入docker用户组,不过在添加的时候,又提示了如 ...
- Linux入门(磁盘与挂载)
Linux入门之 磁盘管理与挂载 在我们使用计算机或者是服务器时,总会需要接入外部存储的时候,正如我们使用的移动硬盘.U盘.接入手机等,就是一个接入外部存储的过程.上述这些在接入Windows时我 ...
- Git版本控制之ubuntu搭建Git服务器
Git是一个开源的分布式版本控制系统,可以有效.高效的处理从很小到非常大的项目版本管理.使得开发者可以通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库,也可以将代码提交到Git服务 ...
- .NET Core API后台架构搭建
ASP.NET Core API后台架构搭建 项目文件:https://files.cnblogs.com/files/ZM191018/WebAPI.zip 本篇可以了解到: 依赖注入 Dapper ...
- Potato土豆win综合提权
0x01 NBNS和WDAP NBNS: 在 Windows 系统中的另外一种名称就是 NetBIOS 名称,准确的说 NetBIOS 名称并非是一种名字系统,而是 Windows 操作系统网络的一个 ...
- shark恒破解笔记1-壳内寻找注册码
记录学习shark恒大教程的学习记录 壳内寻找注册码 OD打开 明显有壳 F9先运行程序 2.Ctrl+G输入401000到解码段,如果出现db ** 说明已经解码过,脱离了程序本身的壳 鼠标右键-& ...
- Hash Table Implementation in C++
对于字符串,所用的hash函数为: size_t _Hash_bytes(const void* ptr, size_t len, size_t seed) { static const size_t ...