C++ 之构造函数(拷贝/复制构造函数)
发布日期:2021-05-14 16:35:32 浏览次数:38 分类:精选文章

本文共 1978 字,大约阅读时间需要 6 分钟。

构造函数

拷贝构造函数概念

拷贝构造函数是一种特殊的构造函数,它在创建对象时,通过使用同一类中之前创建的对象来初始化新创建的对象。这种方式在处理动态内存分配的情况下特别重要。通常有以下几个使用场景:

  • 使用另一个同类型的对象来初始化新对象
  • 将对象作为参数传递给函数
  • 函数返回对象
  • 这种方式确保新对象的所有数据成员都被正确复制,避免了直接使用指针或其他共享资源带来的问题。

    引例分析

    第一问:自定义String类

    要求说明

    需要自定义一个简单的String类,以简化字符串操作。类的成员包括一个字符指针和一个长度属性。默认构造函数初始化为空字符串。

    解决方案

    如果不重载赋值运算符,对象会直接拷贝旧的指针值,这样两个对象会共享同一个内存块。这对包含动态内存分配的类来说是错误的。因此,我们需要重载赋值运算符,确保每次赋值都完成完整的深拷贝。

    String & String::operator=(String & str) {
    delete[] value;
    length = strlen(str.value);
    value = new char[length + 1];
    strcpy(value, str.value);
    return *this;
    }

    第二问:另一种场景

    当同一个类的对象初始化另一个对象时,必须定义拷贝构造函数。

    String str1("abc");
    String str2(str1);

    正确的拷贝构造函数定义如下:

    String::String(const String & str) {
    length = strlen(str.value);
    value = new char[length + 1];
    strcpy(value, str.value);
    }

    具体实例

    MyString类实现

    MyString.h

    #ifndef MYSTRING_H
    #define MYSTRING_H
    #include
    #include
    using namespace std;
    class MYString {
    public:
    MYString();
    MYString(char * str);
    MYString(const MYString & str);
    virtual ~MYString();
    const MYString & operator=(const MYString & str);
    friend ostream & operator<<(ostream & out, const MYString & str);
    protected:
    private:
    int m_length;
    char * m_value;
    };

    MyString.cpp

    #include "MYString.h"
    #include
    MYString::MYString() {
    m_length = 0;
    m_value = new char[1];
    m_value[0] = '\0';
    }
    MYString::MYString(char * str) {
    if (str == NULL) {
    m_value = new char[1];
    m_value[0] = '\0';
    return;
    }
    m_length = strlen(str);
    m_value = new char[m_length + 1];
    strcpy(m_value, str);
    }
    MYString::MYString(const MYString & str) {
    m_length = strlen(str.m_value);
    m_value = new char[m_length + 1];
    strcpy(m_value, str.m_value);
    }
    ostream & operator<<(ostream & out, const MYString & str) {
    out << str.m_value;
    return out;
    }

    小结

    对于简单的类,默认拷贝构造函数通常足够。但在以下情况下,必须显式定义拷贝构造函数:

  • 类包含动态分配的内存
  • 类包含不可共享的资源
  • 类包含虚基类或其他需要深拷贝的成员
  • 拷贝构造函数是确保对象完整拷贝所有数据成员的关键工具,其正确使用是程序开发的重要基础。

    上一篇:C++之类型转换
    下一篇:C++ 之友元函数

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月07日 04时57分15秒