【C++】拷贝构造函数与引用传递参数

问题:调用拷贝构造的时候,能不能用值传递参数?

先说结论:调用拷贝构造的时候,不能用值传递参数,应该用引用传递,否则会导致无限调用拷贝构造,从而栈溢出

原理:值传递的时候,会用实参来构造形参,那么构造形参的过程中又会call拷贝构造,以此内推,无限循环

拷贝构造函数被调用的三种时机:

  1. 用类的一个对象去初始化另一个对象时
  2. 当函数的形参是类的对象时
  3. 当函数的返回值是类的对象或者引用时

这里我们看到第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 }
复制代码

posted on   甲鱼写代码  阅读(258)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示