复制构造函数如何工作

how copy constructors work

#include <iostream>
#include <cassert> // for assert

class IntArray
{
private:
int m_length = 0;
int *m_array = nullptr;

public:
IntArray(int length):
    m_length(length)
{
    if (length <= 0)
        assert("IntArray length should be a positive integer");

    m_array = new int[m_length] { 0 };
}

// Copy constructor that does a deep copy
IntArray(const IntArray &array):
    m_length(array.m_length)
{
    // Allocate a new array
    m_array = new int[m_length];

    // Copy elements from original array to new array
    for (int count = 0; count < array.m_length; ++count)
        m_array[count] = array.m_array[count];
}

~IntArray()
{
    delete[] m_array;
}

// If you're getting crazy values here you probably forgot to do a deep copy in your copy constructor
friend std::ostream& operator<<(std::ostream &out, const IntArray &array)
{
    for (int count = 0; count < array.m_length; ++count)
    {
        std::cout << array.m_array[count] << ' ';
    }
    return out;
}

int& operator[] (const int index)
{
    assert(index >= 0);
    assert(index < m_length);
    return m_array[index];
}

// Assignment operator that does a deep copy
IntArray& operator= (const IntArray &array)
{
    // self-assignment guard
    if (this == &array)
        return *this;

    // If this array already exists, delete it so we don't leak memory
    delete[] m_array;

    m_length = array.m_length;

    // Allocate a new array
    m_array = new int[m_length];

    // Copy elements from original array to new array
    for (int count = 0; count < array.m_length; ++count)
        m_array[count] = array.m_array[count];

    return *this;
}

};

IntArray fillArray()
{
IntArray a(5);
a[0] = 5;
a[1] = 8;
a[2] = 2;
a[3] = 3;
a[4] = 6;

return a;
}

int main()
{
IntArray a = fillArray();

// If you're getting crazy values here you probably forgot to do a deep copy in your copy constructor
std::cout << a << '\n';

IntArray b(1);
a = a;
b = a;

 // If you're getting crazy values here you probably forgot to do a deep   copy in your assignment operator
// or you forgot your self-assignment check
std::cout << b << '\n';

return 0;
}

所以我正在尝试理解这段代码。我知道将为 IntArray a = FillArray() 调用复制构造函数。但是我不知道 IntArray(const IntArray &array) 是如何工作的。我理解语法,但不明白 array.m_length 的来源。我也不明白这些值是如何返回给 IntArray a 的。请帮忙。

m_length 是类型 "int" 的 class 成员。

此代码:

IntArray(const IntArray &array): m_length(array.m_length)

声明了一个带有一个名为 "array" 的参数的函数。分号表示构造函数初始化列表。 m_length 是一个 class 成员,被调出要在此列表中构建。 m_length 是一个 "int",因此调用此函数时会自动调用 int 的复制构造函数。 array.m_length 来自 "array",这是在你的复制构造函数中传递的参数。

I understand the syntax, but dont understand where array.m_length is coming from.

您在函数 IntArray(const IntArray &array) 中,因此 array 是参考参数(即 assignment/initialization 的右侧参数),而 array.m_length 是引用的 IntArray 对象的成员变量 m_length

Nor am I understanding how these values get returned to IntArray a. Please help.

同样,在拷贝构造函数中,你有成员变量m_length(:m_length(array.m_length)的初始化,然后是成员m_array的赋值:

// Allocate a new array
m_array = new int[m_length];
// Copy elements from original array to new array
for (int count = 0; count < array.m_length; ++count)
    m_array[count] = array.m_array[count];

这就是IntArray a = fillArray()语句执行时,fillArray()返回的数组成员变量的值如何赋值给a对应的成员变量。