1

我正忙着写一段代码。代码的功能如下:我有一个班级Student。我想将年级从新生复制到新生2。然后我删除了新生,但新生2应该仍然保留新生的成绩。我想/需要使用复制构造函数来做到这一点。但是,我对复制构造函数并不熟悉。这就是我到目前为止所拥有的。有人可以帮我吗?

#include <iostream>

using namespace std;

class Student
{
public:
    int *grades;
    int size;

    Student (unsigned int n) {grades = new int[n]; size = n;}
    Student(const int& other);
    ~Student() {delete[] grades;}

    Student(Student &old_student) {}
};

int main()
{
    Student *freshman = new Student(1);
    freshman -> grades[0] = 8;

    Student *freshman2 = new Student(*freshman);
    delete freshman;

    cout << freshman2 -> grades[0] << endl;
}

在此先感谢各位:)

4

3 回答 3

3

直截了当:

Student(const Student &other)
    : grades(new int[other.size])
    , size(other.size)
{
    std::copy(other.grades, other.grades+other.size, grades);
}

但请记住,使用实际容器将是更好的解决方案。此外,拥有公共数据成员并不是封装的最佳主意。另一个轻微的风格是被认为using namespace std;是不好的做法。请注意,我已将复制构造函数参数设置为const&.

这是如何工作的

在初始化列表中,我分配了一个与 Student中的数组int相同的新数组,并将其复制到当前的 ( ) Student 对象中。我现在拥有的是一个里面有垃圾的数组及其大小。sizeotherother.sizethis

现在在构造函数的主体内部std::copy获取实际grades的 fromother并将它们复制到我刚刚在初始化列表中分配的数组中。制作这样的副本称为深复制,而不是浅复制

那些参数不是 std::copy 指针而不是迭代器吗?

我可以使用std::copywith 指针,因为指针基本上满足InputIteratorand的要求OutputIterator。我要复制的数组的开头只是指针other.grades,我想复制所有内容直到结尾(这是数组的开头+它的大小,利用指针算法),将副本存储在新的grades.

于 2013-09-18T08:31:38.427 回答
0

复制构造函数采用对相同类型对象的 const 引用。因此,如果您有:

Student(const Student& other);

你认为你会如何使用other参数设置你的类的值?

http://en.wikipedia.org/wiki/Copy_constructor

于 2013-09-18T08:29:02.190 回答
0

一个可能的复制构造函数实现:

Student(const Student &old_student) {
  size = old_student.size;
  grades = new int[size];
  memcpy(grades, old_student.grades, size * sizeof *grades);
}

请参阅risingDarkness 的答案以获得更具指导性的实施。有许多替代方法来编写它。所有正确的实现都会初始化所有数据成员(例如sizegrades),并且它们从 复制数据old_student

第一const行中的使它更有用,请参阅为什么复制构造函数参数是 const?. 但即使没有const它,它也被认为是一个复制构造函数。

分配一个新数组看起来很浪费内存,可以在对象之间共享数组,但这会使析构函数变得更加复杂,因为析构函数必须决定何时删除数组。

于 2013-09-18T08:29:32.150 回答