随笔 - 226,  文章 - 0,  评论 - 4,  阅读 - 30140
  • 如果使用等号初始化一个对象执行的是拷贝初始化,如果不使用等号初始化一个对象执行的是直接初始化。直接初始化直接调用与实参匹配的构造函数,这也包括拷贝构造函数,就能够完成初始化。
  • 拷贝初始化通常调用拷贝构造函数,拷贝初始化首先调用某一构造函数构造一个临时的对象,然后调用拷贝构造将临时对象拷贝到正在创建的对象
  • 这里一定注意拷贝初始化、直接初始化和默认构造、有参构造、拷贝构造的区别

下面通过说明对象构造函数的方式来说明拷贝初始化和直接初始化:

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person {
 5 public:
 6     Person() {
 7         cout << "Person的默认构造" << endl;
 8     }
 9     Person(int age) :age_(age) {
10         cout << "Person的有参构造" << endl;
11     }
12     Person(const Person& p) {
13         cout << "Person的拷贝构造" << endl;
14     }
15 private:
16     int age_;
17 };
18 int main()
19 {
20     //括号法
21     Person p1;//默认构造
22     Person p2(27);//有参构造,直接初始化
23     Person p3(p2);//拷贝构造,直接初始化,将p2的值直接赋值给p3
24 
25     //显示法
26     Person p4;//默认构造
27     Person p5 = Person(27);//有参构造,拷贝初始化,具体用法不大清楚,有个说法是先有参构造创建一个匿名对象,然后调用拷贝构造将匿名对象拷贝给p5,但是这个时候发生了赋值取消,因此这个语句就没调用拷贝构造函数
28     Person p6 = Person(p2);//拷贝构造函数,拷贝初始化,对匿名对象进行拷贝构造后,将匿名对象的值拷贝给p6(发生拷贝构造)
29 
30     //隐式法
31     Person p7 = 27;//有参构造,拷贝初始化,首先发生隐式转换,27原本是int类型的字面值,通过隐式转换成Person类型的字面值,然后拷贝给p7(发生拷贝构造),但实际上编译器可以直接跳过拷贝构造直接有参构造创建对象,相当于Person p7(27),因此将它看成有参构造,这也相当于进行了直接初始化
32     Person p8 = p2;//拷贝构造,拷贝初始化,拷贝构造创建一个临时的对象temp:Person temp(p2),然后将temp的值拷贝给p8(发生拷贝构造)
33     system("pause");
34     return 0;
35 
36 }
复制代码

 

posted on   小凉拖  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示