构造函数语义学——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,就会隐含的声明或隐含的定义一个.生成的 ...
随机推荐
- 阿里云服务器ecs配置之安装nginx
一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...
- 【SQL server基础】初步学习存储过程(好学易懂)
-------------------------------------------------------------------------- ------------------------- ...
- C# HttpWebRequest 后台调用接口上传大文件以及其他参数
直接上代码,包各位看客能用!!! 1.首先请求参数的封装 /// <summary> /// 上传文件 - 请求参数类 /// </summary> public class ...
- Mac OS Catalina 如何删除自带的应用
在新推送的系统升级过后,(博主系统是Mac OS Mojave 10.14)我们会发现,之前我们删除的令人讨厌的Mac自带应用又回来了,如果我们还按照之前百度的方式删除的话,参考: https://w ...
- MongoDB 学习笔记之 Nested doc/DBRef (Spark)
Nested doc/DBRef (Spark) 实现: 运行结果:
- FFmpeg(三) 编解码相关函数理解
一.编解码基本流程 主要流程: 打开视频解码器(音频一样) 软解码.硬解码 进行编解码 下面先来看打开视频解码器 ①avcodec_register_all()//初始化解码 ②先找到解码器. 找解码 ...
- 统计字符的个数,能够组成几个acmicpc
Problem F. String Input file: standard input Output file: standard ou ...
- 解决Mac安装tesserocr报错问题 Failed building wheel for
localhost:~ jerry$ Processing /var/www/git/python/tesserocr -bash: Processing: command not found loc ...
- GUI篇 tkinter (Label,Button)之一
import tkinterfrom tkinter import * # tkinter._test() # 实例化一个窗口对象base = tkinter.Tk()# 修改窗口的标题base.wm ...
- 本人亲测-百度富文本编辑器(无bug版本)
再此我想说明一点,好多教程都是转载别人的,而且也不注明从哪里转载的.每次搜点资料的时候总是跟网上刷小视频的感觉一样.有些人就直接把别人的东西粘贴过来了,一点改动都没有. 废话不多说,直接上教程. (百 ...