构造函数语义学——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,就会隐含的声明或隐含的定义一个.生成的 ...
随机推荐
- C++——多文件结构和编译预处理命令
[toc] 一.多文件结构 1.一个工程可以划分为多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main函数所在的.cpp文件) 2.利用工程来组合各个文件 //Poi ...
- $(document).height 与$(window).height的区别
$(document).scrollTop() 获取垂直滚动的距离 (即当前滚动的地方的窗口顶端到整个页面顶端的距离)$(document).scrollLeft() 这是获取水平滚动条的距离 要获取 ...
- python句柄部分操作
```python3# 通过窗口类名.窗口标题获取控件句柄hwnd = win32gui.FindWindow("ClassName", "TitleName" ...
- .NET进阶篇-语言章-2-Delegate委托、Event事件
知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和La ...
- spring boot项目下application.properties中使用logging.path和logging.file时的细节
logging.path仅仅用于指定日志输出的目录,且不能指定输出的文件名,且默认名为spring.log 若指定的是相对目录,则会生成在当前总项目的目录下 idea中新建sprnig boot项目 ...
- TP框架配合jquery进行3种方式的多图片上传
用的TP5.1框架+jquery 一 使用form表单方式进行多图片上传 html代码: <form action="../admin/admin/cs" enctype=& ...
- 【THE LAST TIME】this:call、apply、bind
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- CSS定位机制:浮动 float及清除浮动的常用方法
CSS的定位机制 1.普通流(标准流) 默认状态,元素自动从左往右,从上往下排列 块元素的特征: 独占一行 可以设置宽高 如果不设置宽度,宽度默认为容器的100% 常见的块元素:div p h1-h6 ...
- 秘制CSP模板
不定期更细中...... 声明1:由于js的问题导致VIEW CODE按钮只能点"I"附近才能展开代码 声明2:为了排版的美观,所有的解释以及需要留意的地方我都放在代码中了 声明3 ...
- Spring Cloud OAuth2 实现用户认证及单点登录
文章较长,建议推荐,建议转发,建议收藏,建议关注公众号哈. OAuth 2 有四种授权模式,分别是授权码模式(authorization code).简化模式(implicit).密码模式(resou ...