13.拷贝初始化和直接初始化

Sandals-little / 2023-07-24 / 原文

  • 如果使用等号初始化一个对象执行的是拷贝初始化,如果不使用等号初始化一个对象执行的是直接初始化
  • 如果使用字面值拷贝初始化一个对象则会先创建一个临时对象然后在用这个临时的对象拷贝初始化等号左边的值
  • 这里一定注意拷贝初始化、直接初始化和默认构造、有参构造、拷贝构造的区别

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

 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;//有参构造,拷贝初始化,有参构造创建一个临时的对象temp:Person temp(27),然后将temp的值拷贝给p7
32     Person p8 = p2;//拷贝构造,拷贝初始化,拷贝构造创建一个临时的对象temp:Person temp(p2),然后将temp的值拷贝给p8
33     system("pause");
34     return 0;
35 
36 }