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

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

 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 2023-07-24 15:03  小凉拖  阅读(80)  评论(0编辑  收藏  举报