【C++札记】拷贝构造函数,浅拷贝和深拷贝

一:拷贝构造函数

拷贝构造函数是一种特殊的构造函数,遵循如下的规则:

1.函数名和类名一致,没有返回值。

2.必须有一个参数,参数是本类型的一个引用变量。

3.拷贝构造函数可以访问参数对象的任意成员(private也可以)。

4.若自己不提供拷贝构造函数,系统会提供默认构造函数,若自己定义,系统将不再提供。

5.系统提供的拷贝构造是浅拷贝。

书写示例如下:

class Student
{
public:
	//构造函数
	Student(int a, char* p);

	//拷贝构造函数
	Student(const Student& stu);

	char name[32];
	int  age;
};

拷贝构造函数调用

	//调用方法1
	Object obj1;
	Object obj2(obj1); //或者写成:Object obj2 = obj1;

	//调用方法2
	Object  obj1;
	Object* obj2 = new Object(obj1);

二:浅拷贝

浅拷贝不开辟新空间,只增加一个指针,指向原有的内存。

#include <iostream>
using namespace std;

class Student
{
public:
    //构造函数
    Student(const char* myName)
    {
        int len = strlen(myName);
        name = new char[len + 1]{0};
        strcpy_s(this->name, len+1, myName);

        cout << "构造:" << hex << (int)name << endl;
    }

    //析构函数
    ~Student()
    {
        if (name)
        {
            cout << "析构:" << hex << (int)name << endl;
            delete[] name;
            name = NULL;
        }
    }

    //拷贝构造函数(浅拷贝)
    Student(const Student& stu)
    {
        name = stu.name;
        cout << "调用拷贝构造函数" << endl;
    }

private:
    char*	name;
};


int main()
{
    {
        Student stu1("hongshaorou");

        Student stu2(stu1);
    }

}

运行过程中发生了崩溃

是因为对相同的内存地址做了两次析构导致,打印出内存地址一目了然。

三:深拷贝

深拷贝会开辟新的内存空间,把原有的对象复制过来。见下图:

对上边浅拷贝代码进行修改

class Student
{
public:
    //构造函数
    Student(const char* myName)
    {
        int len = strlen(myName);
        name = new char[len + 1]{0};
        strcpy_s(this->name, len+1, myName);

        cout << "构造:" << hex << (int)name << endl;
    }

    //析构函数
    ~Student()
    {
        if (name)
        {
            cout << "析构:" << hex << (int)name << endl;
            delete[] name;
            name = NULL;
        }
    }

    //拷贝构造函数(深拷贝)
    Student(const Student& stu)
    {
        int len = strlen(stu.name);
        name = new char[len + 1];
        strcpy_s(name, len + 1, stu.name);
        cout << "调用拷贝构造函数" << hex << (int)name<< endl;
    }

private:
    char*	name;
};

再次运行不会发生崩溃现象,打印内存地址可见,开辟了内存空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农code之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值