- 如果使用等号初始化一个对象执行的是拷贝初始化,如果不使用等号初始化一个对象执行的是直接初始化。直接初始化直接调用与实参匹配的构造函数,这也包括拷贝构造函数,就能够完成初始化。
- 拷贝初始化通常调用拷贝构造函数,拷贝初始化首先调用某一构造函数构造一个临时的对象,然后调用拷贝构造将临时对象拷贝到正在创建的对象
- 这里一定注意拷贝初始化、直接初始化和默认构造、有参构造、拷贝构造的区别
下面通过说明对象构造函数的方式来说明拷贝初始化和直接初始化:
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 }