【C++】拷贝构造函数与引用传递参数
问题:调用拷贝构造的时候,能不能用值传递参数?
先说结论:调用拷贝构造的时候,不能用值传递参数,应该用引用传递,否则会导致无限调用拷贝构造,从而栈溢出
原理:值传递的时候,会用实参来构造形参,那么构造形参的过程中又会call拷贝构造,以此内推,无限循环
拷贝构造函数被调用的三种时机:
- 用类的一个对象去初始化另一个对象时
- 当函数的形参是类的对象时
- 当函数的返回值是类的对象或者引用时
这里我们看到第2点,函数的形参是类的对象,也就是像这样 void fun(A a) ,如果我们的拷贝构造函数采用值传递,那么就长这样 A( A a),所以也就是说,当形参作为函数的参数,不论是普通函数还是构造函数,都会调用拷贝构造,于是拷贝构造函数如果采用形参传递值,自然就会无限递归从而栈溢出。
所以拷贝构造函数的形参一定要设置为引用!
这里贴出三种情况的案例代码:
1.
1 Date d2(d1); // 初始化对象 d2 2 Date d3 = d1; // 初始化对象 d3 3 //这两条语句都会调用拷贝构造函数, 这两行代码的语句作用是等价的
2.
1 #include<iostream> 2 class A{ 3 public: 4 A(){}; 5 A(const A & a){ 6 std::cout << "使用拷贝构造函数初始化参数" << std::endl; 7 } 8 }; 9 void Test(A a){} 10 int main(){ 11 A a; 12 Test(a); 13 return 0; 14 }
3.
1 #include<iostream> 2 class A { 3 public: 4 A(int a = 0) :_a(a){}; 5 A(const A& a) { 6 _a = a._a; 7 std::cout << "拷贝构造函数" << std::endl; 8 } 9 int _a; 10 }; 11 A Test() { 12 A a(2); 13 return a; 14 } 15 int main() { 16 auto tmp = Test(); 17 std::cout << tmp._a << std::endl; 18 return 0; 19 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了