- 如果使用等号初始化一个对象执行的是拷贝初始化,如果不使用等号初始化一个对象执行的是直接初始化。直接初始化直接调用与实参匹配的构造函数,这也包括拷贝构造函数,就能够完成初始化。
- 拷贝初始化通常调用拷贝构造函数,拷贝初始化首先调用某一构造函数构造一个临时的对象,然后调用拷贝构造将临时对象拷贝到正在创建的对象
- 这里一定注意拷贝初始化、直接初始化和默认构造、有参构造、拷贝构造的区别
下面通过说明对象构造函数的方式来说明拷贝初始化和直接初始化:
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!