Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1678963
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2021-05-30 21:20:00

Copy constructor
当一个类展现出bitewise copy semantics时,编译器就会生成trivial 的copy constructor,否则生成non-trivial的copy constructor,两者的界定就是“是否编译器会额外安插代码”,不展现bitewise copy semantics的情况如下:
1. 当一个class内含有一个member object 而后者的class声明有copy constructor
2. 当class继承了一个定义了copy constructor的class
3. 当class声明了virtual function(设置vptr)
4. 当class派生自一个继承串链,其中有一个或多个virtual base class时(设置virtual_base_ptr)


C++标准说:把一个class object当做参数传递给一个函数,或者作为一个函数的返回值,相当于以下形势的调用:X xx=arg,其中xx代表形势参数而arg代表真正的参数值,其中,传递和返回分别的编译阶段转换如下:
传递:形如  void foo(X xx){} 的调用,会被编译器转换为:
// 伪代码  
X tmp;// 定义一个临时变量
tmp.X::X(arg)// copy constructor初始化
void foo(X& xx) // 函数改成引用传递
//函数返回
tmp.X::~X()//析构临时变量


形如X bar(){},的调用,会被编译器转换成:
X ret;//提前定义返回变量  
void bar(X &xx); //先给函数添加一个引用类型的参数
ret.X::X(xx)//之后在return之前安插一个copy contructor调用,改写后的函数不返回任何值(NRV优化) 
return; // 返回

主动声明copy constructor会激活c++编译器当中的NRV{Named Return Value}优化


C++必须在成员初始化列表初始化的几项
1. reference member
2. const member
3. 调用基类的constructor
4. 调用一个member class的constructor

编译器会一一操作initialization list,以适当的顺序在constructor中安插初始化操作,并且在任何explicit user code 之前

                                   
阅读(1260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~