C++中的拷贝构造函数

class Student
{
public:
    Student()
    {cout<<"Student"<<endl;}
private:
    string m_strName;
};
int main()
{
    Student S1;
    Student S2=S1;
    Student S3(S2);
    return 0;
}

此程序的运行结果:

这里写图片描述
在实例化对象的时候不应该调用3次构造函数吗?


拷贝构造函数

实际上,只有S1在被实例化的时候调用了构造函数,而S2和S3调用了拷贝构造函数。

拷贝构造函数的格式

class Student
{
public:
    Student()
    {cout<<"Student"<<endl;}
    Student(const Student &stu){}
private:
    string m_strName;
};

1.当类中没有定义拷贝构造函数,编译器自动生成一个默认拷贝构造函数,这和构造函数是一样的。

2.当采用直接初始化或是复制初始化实例对象时系统自动调用拷贝构造函数。

注意:拷贝构造函数是无法被重载的。


如何创建拷贝构造函数

第一种:

class Student
{
public:
    Student()
    {
        cout << "Student" << endl;
    }

    Student(const Student &)//定义的引用变量可以不用
    {
        cout << "Student(const Student &)" << endl;
    }
private:
    string m_strName;
};
int main()
{
    Student S1;
    Student S2 = S1;
    Student S3(S2);
    return 0;
}

输出结果:
这里写图片描述

第二种 函数参数传递的时候也会调用拷贝构造函数

class Student
{
public:
    Student()
    {
        cout << "Student" << endl;
    }

    Student(const Student &)//定义的引用变量可以不用
    {
        cout << "Student(const Student &)" << endl;
    }![这里写图片描述](http://img.blog.csdn.net/20161010220505715)
private:
    string m_strName;
};

void test(Student t)
{}

int main()
{
    Student S1;
    Student S2 = S1;
    Student S3(S2);
    return 0;
}

运行结果是这里写图片描述


深拷贝与浅拷贝

浅拷贝:

#include <iostream>
using namespace std;
class A
{
public:
    A(int a)
    {
        p = new int[a];
        cout << "AAAAAAAAAAAAAAAAAAAAA" << endl;
    }
    /*
    A(const A &B)
    {
        _a=B._a;
        p=B.p;
    }
   这种写法与系统默认拷贝构造函数一样都是属于浅拷贝。
*/

    ~A()
    {
        delete[]p;
        p = NULL;
        cout << "~~~~~~~~~~~~~~~~~" << endl;
    }
    void print()
    {
        cout << "地址:" << p << endl;
    }

private:
    int _a;
    int *p;
};


int main()
{
    A student1(6);
    A student2(student1);
    student1.print();
    student2.print();

    return 0;
}

以上代码调用系统默认的拷贝构造函数,但是运行时出现内存泄漏。
运行结果为这里写图片描述

由于浅拷贝中两个对象中的成员指针变量p1和p2同时指向了一块内存,而main()函数执行之后,对象student1调用析构函数,释放了student1中指针所指向的那块内存,当对象student2再次调用析构函数,想要释放指向的内存时,就会出现内存泄漏。

深拷贝:

#include <iostream>
using namespace std;
class A
{
public:
    A(int a)
    {
        p = new int[a];
        cout << "AAAAAAAAAAAAAAAAAAAAA" << endl;

        for (int i=0; i < _a; i++)
        {
            p[i] =i ;
        }
    }

    A(const A &B)
    {
        cout << "调用拷贝构造函数" << endl;
        _a = B._a;
        p=new int[_a];
        for (int i=0; i < _a; i++)
        {
            p[i] = B.p[i];
        }
    }
    ~A()
    {
        delete[]p;
        p = NULL;
        cout << "~~~~~~~~~~~~~~~~~" << endl;
    }
    void print()
    {
        cout << "地址:" << p << endl;
    }

private:
    int _a;
    int *p;
};


int main()
{
    A student1(6);
    A student2(student1);
    student1.print();
    student2.print();

    return 0;
}

运行结果为:
这里写图片描述

深拷贝不会报错,即深拷贝不会出现内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++拷贝构造函数是一种特殊的构造函数,它由编译器在特定情况下自动调用,用于创建一个新的对象并将其初始化为已有对象的副本。拷贝构造函数的参数通常采用引用的方式传递,以避免无限递归的问题。 对于类C拷贝构造函数,可以通过以下方式进行定义: ```cpp class C { public: // 拷贝构造函数 C(const C& other) { // 在此处进行对象的成员变量的拷贝 // 可以使用已有对象的成员变量值来初始化新对象的成员变量 } }; ``` 拷贝构造函数的作用是创建一个新对象,并将已有对象的成员变量值复制给新对象的对应成员变量。需要注意的是,函数成员是共用的,只有一份拷贝,所以拷贝构造函数只需要复制数据成员即可。 拷贝构造函数可以用来进行对象的初始化,例如通过已有对象来初始化新对象的存储空间。这种情况下,编译器会自动调用拷贝构造函数来完成初始化过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++——拷贝构造函数](https://blog.csdn.net/weixin_59179454/article/details/124853916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值