C++(一)拷贝构造函数栈溢出的原因

一、            什么是拷贝构造函数

就是构造函数的一种,用于实现同一类对象的构建和初始化。

拷贝构造函数是由普通构造函数赋值操作符共同实现的。

一般用于:

(1)   函数形参,值传递

(2)   函数返回值,值传递

(3)   一个对象给另一个对象初始化

如:Test a3=Test(a1);

因为值传递是传递对象的副本,所以会编译器会自动调用拷贝构造函数。

用一个已存在的对象对一个新的对象初始化,不会生成临时对象,而是新对象直接调用已存在对象的拷贝构造函数。

 

二、            如何重载赋值操作符

    Test&operator=(const Test &a)
    {
        this->data=a.data;
        return *this;
    }


三、            上述两者的纠结关系

 

先来看看如下的程序,实现了重载赋值操作符和拷贝构造函数:

#include <iostream>
using namespace std;
 
class Test
{
private :
int data;
public :
   Test(){}
   Test(int n):data(n){}
   Test(const Test &old)
    {
       *this=old;
      cout<<"拷贝构造函数!"<<endl;
    }
   Test &operator=(const Test &a)
    {
       this->data=a.data;
       cout<<"赋值运算符重载啦"<<endl;
       return *this;
    }
};
 
int main()
{
   Test a1(5);
   Test a2;
   a2=a1;
   Test a3=Test(a1);
   return 0;
}


 

 

这就是被调用的重载赋值操作符函数:


其中:

如果红框中不加 & 引用标识符,那么函数返回值属于值传递,编译器调用拷贝构造函数生成一个对象副本。


如果红框中不加 & 引用标识符,那么函数参数值属于值传递,编译器调用拷贝构造函数生成一个对象副本。

这就是被调用的拷贝构造函数:


  调用了赋值操作符函数。

所以如果赋值操作符函数不是const & Test 引用类型,而是值传递,就会有:

    赋值运算符的参数值传递调用拷贝构造函数

拷贝构造函数中的“=”调用赋值运算符函数

赋值运算符的参数值传递调用拷贝构造函数

拷贝构造函数中的“=”调用赋值运算符函数

重复调用直至栈溢出。

 

 

总结:

(1)      拷贝构造函数的返回值和传入的参数一定要是引用类型(否则栈溢出),而且一般都是不希望参数在函数中被改变,所以是const 常引用。

(2)      拷贝构造函数用于,生成对象副本(值传递就会生成对象副本)和给新对象初始化时(新对象调用旧对象的拷贝构造函数)。

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值