C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)
本文是 Inside The C++ Object Model's Chapter 2 的部分读书笔记。
有三种情况,需要拷贝构造函数:
1)object直接为另外一个object的初始值
2)object作为函数以值传递的参数
3) object以函数返回值形式返回
如果class没有提供一个explicit copy constructor时,编译器会以default memberwise initialization,也就是把每一个内建的或者派生的data member的值,从某个object直接拷贝到另外一个object上,对于member class object,以递归的方式施行memberwise initialization。
编译器并不会生成trivial的copy constructor,除非是bitwise copy semantics,以下四种情况就是非bitwise copy semantics:
1)class的某个member object声明有一个copy constructor时,这个copy constructor不会是被设计者声明的,或者是被编译器合成的
2)class继承自的base class含有copy constructor时
3)class含有virtual functions
4)class的base class是virtual时
编译器需要合成copy constructor,并且调用member object或者base class的copy constructor。
对于virtual function或者virtual inheritance,编译器需要为每一个object设计好vptr以便在runtime获取到正确的virtual function table。因为vptr处理不好有可能发生对象的sliced,导致出现blow up。
总结:
如果class是bitwise copy semantics,那么编译器不会合成copy constructor,只是按照default memberwise initialization copy source object到destination object。否则,编译器将合成copy constructor,以调用member object或者base class的copy constructor或者使得vptr设置好,使得在runtime可以使virtual base class或者base
class可以正确访问virtual functions。
注意,本文只是说明编译器在copy constructor上为我们做了什么,并不是编译器合成的copy constructor就是安全可用的。这里需要和deep copy(深拷贝)/shallow copy(浅拷贝)加以区别。和编译器是否为我们合成default constructor一样,它只是完成自己的职责,并不会为non class member object and non-static members 初始化。 如果需要deep copy,设计者必须explicit declare copy
constructor。否则即使编译器合成了,也会使得程序出现undefined behaviors。
C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)的更多相关文章
- The Semantics of Constructors(拷贝构造函数之编译背后的行为)
本文是 Inside The C++ Object Model's Chapter 2 的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...
- 【C++对象模型】构造函数语意学之二 拷贝构造函数
关于默认拷贝构造函数,有一点和默认构造函数类似,就是编译器只有在[需要的时候]才去合成默认的拷贝构造函数. 在什么时候才是[需要的时候]呢? 也就是类不展现[bitwise copy semantic ...
- 深入探索C++对象模型(二)
构造函数语义学(The Semantics of Constructors) Default Constructor的构造操作 对于class X,如果没有任何user-declared constr ...
- C++对象模型的那些事儿之四:拷贝构造函数
前言 对于一个没有实例化的空类,编译器不会给它默认生成任何函数,当实例化一个空类后,编译器会根据需要生成相应的函数.这类函数包括一下几个: 构造函数 拷贝构造函数 析构函数 赋值运算符 在上一篇博文C ...
- copy深浅拷贝
我们在很多方法里都看到copy()方法,这是对变量的复制,赋值,下面来看一下实例: 复制方法调用的是copy模块中的方法: import copy copy.copy() #前拷贝 c ...
- 包,logging日志模块,copy深浅拷贝
一 包 package 包就是一个包含了 __init__.py文件的文件夹 包是模块的一种表现形式,包即模块 首次导入包: 先创建一个执行文件的名称空间 1.创建包下面的__init__.py文件的 ...
- 使用copy来拷贝对象
拷贝对象 您通过将 copy 消息发送给对象,以制作对象的副本. NSArray *myArray = [yourArray copy]; 要拷贝,接收对象的类必须遵守 NSCopying 协议.如果 ...
- 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ...
- (C++)关于拷贝构造函数 Copy Constructor
题目: In which of the following scenarios is a Copy Constructor called or invoked? A. When no conve ...
随机推荐
- SSH使用密钥登录并禁止口令登录实践
生成PublicKey Linux:ssh-keygen -t rsa[私钥 (id_rsa) 与公钥 (id_rsa.pub)]Windows:SecurCRT/Xshell/PuTTY[SSH-2 ...
- Volley的基本用法
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- 表格组件神器:bootstrap table详细使用指南
1.bootstrap-table简介 1.1.bootstrap table简介及特征: Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单 ...
- css背景色 透明字体不透明
.demo{ padding: 25px; background-color: rgba(,,,0.5);/* IE9.标准浏览器.IE6和部分IE7内核的浏览器(如QQ浏览器)会读懂 */ }
- 第一个微信小程序踩的几个小坑
1.小程序测试调试阶段可以打开项目设置中的“开发环境不校验请求域名.TLS版本及HTTPS证书”配置,即可以和自己的服务器联调了. (需要在工具栏的设置 -> 项目设置 中配置,mac下直接co ...
- hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...
- springmvc中配置servlet初始化类
<bean id="InitStart" lazy-init="false" init-method="InitSystem" cl ...
- 伯乐在线资讯URL
伯乐资讯URL # encoding: utf-8 import requests from bs4 import BeautifulSoup import csv import time base_ ...
- Django 博客开发教程目录索引
Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...
- UI_UITableView_搭建
创建 tableView UITableViewStyle 有两种选择 #pragma mark - 创建 tableView - (void)createTableView { // 枚举类型共同拥 ...