构造函数与复制构造函数迷惑问题

本文深入探讨C++中复制构造函数的作用与实现,解释其实现细节,尤其是在避免浅复制和重复析构中的关键作用。通过具体代码示例,阐述了在函数参数中使用引用与非引用的区别,以及复制构造函数在不同情况下的调用行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数与复制构造函数

在复制构造函数中的引用符,时有时不有,初学时不易理解,做点小归纳:

预备知识:

  • 当类中没有定义任何构造函数(包括复制构造函数)时,编译器将生成默认构造函数

  • 当类中没有定义复制构造函数时,编译器将生成默认构造函数

  • 形参与实参的传值与传引用

  • 复制构造函数主要用途是避免浅复制即对象内指针成员指向同一块内存区域

    • 如果对象中有主动分配的内存时,在对象被析构释放分配的内存时,避免出现重复析构;
    • 避免调用函数内部对形参对象的指针变量所指向的区域修改影响到实参;

带不带引用符的两种情况:

1. 若调用函数的类参数带引用符号时,则为引用传递,则此时不进行实例化对象

2. 若调用函数的类参数不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化

​ a. 若没有复制构造函数,则在值传递过程出现浅复制(只将数据成员进行传值复制),出现重复析构;

​ b. 若存在复制构造函数,

TALK IS CHEAP , SHOW YOU CODE:

需要的代码如下,后面根据不同情况做点小更改,就不再复制粘贴了;

class MAN {
public :
    int *arr;
    int size;
    MAN(const MAN  & m);               //复制构造函数
        
    MAN( ) {                                        //构造函数
        cout << "-----------construct" << endl;
        arr = new int[20];
        size = 20; 
    }

    ~MAN( ) { delete[ ]arr; } // 析构
};
//MAN::MAN(const MAN &m) {
//  cout << "-----------copy construct" << endl;
//  arr = new int[20];
//  size = m.size;
//  memcpy(arr, m.arr, 20);
//}
void dis(MAN &x) {
    cout << "   in  disssssss" << endl;
    x.size = 666;
    cout << x.arr << endl;
    cout << "   out  disssssss" << endl;
}
int main( ) {
    MAN s;
    cout << s.size << endl;
    cout << s.arr << endl;
    dis(s);
    cout << s.size << endl;
    cout << s.arr<< endl;
}

1. 若调用函数的类参数带引用符号时,则为引用传递,则此时不进行实例化对象

     声明复制构造函数,注释定义,此时不调用复制构造函数

1512048-20190908161234331-1200955190.png

2. 若调用函数的类参数不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化

  • 若没有复制构造函数,则在值传递过程出现浅复制(只将数据成员进行传值复制),出现重复析构;

       复制构造函数注释定义,并将dis参数表中&符去掉;

    1512048-20190908161749655-94636723.png
    链接时出错,说明需要调用复制构造函数

        将复制构造函数全注释,并将dis参数表中&符去掉;则使用编译器默认的复制构造函数,出现浅复制                

    1512048-20190908162010072-2116438174.png
    运行到主函数结尾,重复析构出现异常。

  • 若存在复制构造函数,

               将复制构造函数全解注释,并将dis参数表中&符去掉;

    1512048-20190908162448464-918274564.png
    程序运行正常

转载于:https://www.cnblogs.com/starrys/p/11486850.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值