[C/C++] 拷贝构造函数

本文详细介绍了C++中的拷贝构造函数的概念及其重要性。通过实例代码演示了拷贝构造函数的定义与实现过程,并解释了在对象包含指针或不可共享资源时,为何需要显式编写拷贝构造函数。

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

拷贝构造函数

复制构造函数(英语:Copy constructor)是C++编程语言中的一种特别的构造函数,习惯上用来创建一个全新的对象,这个全新的对象相当于已存在对象的副本。这个构造函数只有一个参数(引数):就是用来复制对象的引用(常用const修饰)。构造函数也可以有更多的参数,但除了最左第一个参数是该类的引用类型外,其它参数必须有默认值。

类的复制构造函数原型通常如下:

Class_name(const Class_name & src);

一般来说,假如程序员没有自行编写复制构造函数,那么编译器会自动地替每一个类创建一个复制构造函数;相反地,程序员有自行编写复制构造函数,那么编译器就不会创建它。

当对象包括指针或是不可分享的引用时,程序员编写显式的复制构造函数是有其必要性的,例如处理文件的部分,除了复制构造函数之外,应该还要再编写析构函数与赋值运算符的部分,也就是三法则。

↑引自维基百科:复制构造函数

例子:

my-copydata.h

#ifndef __MYCOPYDEMO__
#define __MYCOPYDEMO__

class CopyDemo
{
public:
    CopyDemo(const char* data = 0);
    CopyDemo(const CopyDemo& data); // 拷贝构造
    CopyDemo& operator=(const CopyDemo& data);
    ~CopyDemo();
    char* get_data() const { return data_; }
private:
    char* data_;
};
#endif // !__MYCOPYDEMO__

my-copydata.cc

#include "my-copydata.h"

#include <string.h>

CopyDemo::CopyDemo(const char* data)
{
    if (data)
    {
        data_ = new char[strlen(data) + 1];
        strcpy(data_, data);
    }
    else
    {
        data_ = new char[1];
        *data_ = '\0';
    }
}

CopyDemo::CopyDemo(const CopyDemo& data) // 拷贝构造
{
    data_ = new char[strlen(data.data_) + 1]; // 深拷贝
    strcpy(data_, data.data_);
}

// 拷贝赋值 operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 
CopyDemo& CopyDemo::operator=(const CopyDemo& data) // 拷贝赋值
{
    if (this == &data)
    {  // 检测自我赋值
        return *this;
    }

    delete[] data_; // 释放本身空间
    data_ = new char[strlen(data.data_) + 1]; // 创建新的空间
    strcpy(data_, data.data_); // 拷贝内容
    return *this;
}

CopyDemo::~CopyDemo()
{
    delete[] data_;
}

main.cc

#include "my-copydata.h"

int main()
{
    CopyDemo s1;
    CopyDemo s2("hello");

    CopyDemo s3(s1);
    printf("s3 = %p, data=%s\n", &s3, s3.get_data());

    s3 = s2;
    printf("s3 = %p, data=%s\n", &s3, s3.get_data());

    getchar();
    return 0;
}

// 结果:
// s3 = 008FFB4C, data=
// s3 = 008FFB4C, data=hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值