C++ - 复制 & copy构造函数

  1. 复制
  2. 复制构造函数
    1. 一个错误的示范
    2. 正确的方法 – 拷贝构造函数

C++ 学习笔记

C++ 中的 复制 & 复制构造函数

经验之谈 :尽量使用 const reference, this’s important

复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Vector2
{
public:
float x, y;
public:
Vector2(float x, float y)
:x(x), y(y) {}
};

// 程序的主函数
int main()
{
int a = 1;
int b = a; // 这儿就是一个复制,a & b 存放于两个不同的内存地址

// class 也是一样
Vector2 v1(1,2);
Vector2 v2 = v1; // 这儿就是一个复制

v2.x = 12; // v1.x 依旧是 2

Vector2* v3 = new Vector2(1,2);
Vector2* v4 = v3; // 其实这儿也算是一个复制,只不过是复制指针(地址),它们指向同一个地址
v4->y = 1.90; // v3 也会收影响

return 0;
}

复制构造函数

一个错误的示范

  • 运行下面这段代码,就会crash
  • 因为obj复制,导致 m_Buffer 指向 heap 上的同一个地址,会被释放两次,crash
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <string>
    #include <iostream>

    class String
    {
    private:
    char* m_Buffer;
    unsigned int m_Size;
    public:
    String(const char* s)
    {
    m_Size = strlen(s);
    m_Buffer = new char[m_Size + 1];
    // for (int i = 0; i < m_Size; ++i) {
    // m_Buffer[i] = s[i];
    // }
    memcpy(m_Buffer, s, m_Size);
    m_Buffer[m_Size] = 0;
    }

    ~String()
    {
    delete[] m_Buffer;
    }

    char&operator[](int index)
    {
    return m_Buffer[index];
    }

    friend std::ostream& operator<<(std::ostream& stream, const String& str);
    };

    std::ostream& operator<<(std::ostream& stream, const String& str)
    {
    stream << str.m_Buffer;
    return stream;
    }

    // 程序的主函数
    int main()
    {
    String str = "QinHan";
    String str2 = str;

    str2[2] = 'a';

    std::cout << str <<std::endl;
    std::cout << str2 <<std::endl;

    return 0;
    }

正确的方法 – 拷贝构造函数

  • c++ 默认class是有一个拷贝构造函数的
  • 定义 : 构造函数的入参为 const reference
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <string>
    #include <iostream>

    class String
    {
    private:
    char* m_Buffer;
    unsigned int m_Size;
    public:
    String(const char* s)
    {
    m_Size = strlen(s);
    m_Buffer = new char[m_Size + 1];
    // for (int i = 0; i < m_Size; ++i) {
    // m_Buffer[i] = s[i];
    // }
    memcpy(m_Buffer, s, m_Size);
    m_Buffer[m_Size] = 0;
    }

    // 复制构造函数
    // 入参为 const reference
    String(const String& other)
    : m_Size(other.m_Size)
    {
    m_Buffer = new char[other.m_Size+1];
    memcpy(m_Buffer, other.m_Buffer, m_Size+1);
    }

    ~String()
    {
    delete[] m_Buffer;
    }

    char&operator[](int index)
    {
    return m_Buffer[index];
    }

    friend std::ostream& operator<<(std::ostream& stream, const String& str);
    };

    std::ostream& operator<<(std::ostream& stream, const String& str)
    {
    stream << str.m_Buffer;
    return stream;
    }

    // 程序的主函数
    int main()
    {
    String str = "QinHan";
    String str2 = str;

    str2[2] = 'a';

    std::cout << str <<std::endl;
    std::cout << str2 <<std::endl;

    return 0;
    }

欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinhan_shu@163.com

文章标题:C++ - 复制 & copy构造函数

本文作者:QinHan

发布时间:2019-12-28, 23:16:22

最后更新:2020-02-20, 05:42:12

原始链接:https://qinhan.site/2019/12/28/cpp-copy/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏