C++ 直接初始化和拷贝初始化
来源:互联网 发布:齐天乐春节晚会 知乎 编辑:程序博客网 时间:2024/06/18 18:41
直接初始化和拷贝初始化
参考来源:《C++ primer(第五版)》
关于这两个概念,我相信有不少人会感到疑惑,今天我就带着大家一起弄清楚他们的区别。
首先我们介绍直接初始化:编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里,那我们直接看代码:
//先设计这样的一个类class A{public: A(){ cout << "A()" << endl; } A(int a){ cout << "A(int a)" << endl; } A(const A&){ cout << "A(const A&)" << endl; }};
A a1(10); //直接初始化A a2(a1); //直接初始化
结果为:
A(int a)A(const A&)
通过上述的例子,我们可以发现直接初始化其实就是根据传入的参数选择最匹配的构造函数来进行初始化。但是其中有一个误区需要指出:直接初始化有可能调用拷贝构造函数!!!不能因为直接初始化不是拷贝初始化,就想当然认为其不可能调用拷贝构造函数。
接下来,让我们再看看拷贝初始化。
A a3 = a2; //拷贝初始化1A a4 = 2; //拷贝初始化2A a5 = A(3); //拷贝初始化3
结果为:
A(const A&)A(int a)A(int a)
上面介绍了在用=定义变量时发生的拷贝初始化,让我们仔细地来分析一下:
第1种情况:很好理解,是用a2去初始化a3,其实是
A a3(a2);
所以本次拷贝初始化是用了拷贝构造函数。第2种情况:其实是相当于进行了两步:
A a4 = A(2);
这一步称之为隐式类型转化。A a4(A(2));
其实也是调用了拷贝构造函数。- 但需要注意的是:有的编译器会做一定的优化,即在vs2013环境下,会将该种情况直接变为
A a4(2);
- 第3种情况:其实就是
A a5(A(3));
同样在vs2013环境下会被优化为A a5(3);
拷贝构造初始除了用等号定义的情况,还有以下几种情况:
将一个对象作为实参传递给一个非引用类型的形参
void test(A a);
从一个返回类型为非引用类型的函数返回一个对象
A test();
用花括号列表初始化一个数组中的元素或一个聚合类中的成员
string str[2]{"lll","ttt"};
某些类类型还会对他们所分配的对象使用拷贝初始化。如vector调用其insert或push成员。
阅读全文
0 0
- 直接初始化和拷贝初始化
- 直接初始化和拷贝初始化
- C++ 直接初始化和拷贝初始化
- c++基础:拷贝初始化和直接初始化的误区
- 直接初始化与拷贝初始化学习笔记
- 直接初始化与拷贝(复制)初始化
- 直接初始化与拷贝(复制)初始化
- 直接初始化和复制初始化
- 直接初始化和复制初始化
- 复制初始化和直接初始化
- C++中string和char的区别以及直接初始化和拷贝初始化
- C++直接初始化和复制初始化
- C++ 直接初始化和复制初始化
- C++直接初始化和复制初始化
- 复制初始化和直接初始化的区别
- js 直接初始化和赋值初始化?
- C++直接初始化和复制初始化
- c++直接初始化和复制初始化 理解
- UVA11557 KMP+HASH
- Java实现身份证号码验证
- 调用系统相机开启录像功能
- 安卓相机的使用
- 多个.c文件编译
- C++ 直接初始化和拷贝初始化
- 选择分支语句,continue与break和return之间的区别,随机数,清除屏幕垃圾,退出程序
- 前端之nodejs(三)
- 什么是mata标签
- SSH党校培训系统
- 我的周内反思
- CF875B 思维
- 18种和“距离(distance)”、“相似度(similarity)”相关的量的小结
- orcad创建元器件方法