Нужен ли тут конструктор копирования

250
20 мая 2018, 22:10

Вообщем есть такое задание.

Создать класс Студент с полями фамилия, количество оценок, оценки (динамический массив оценок). определить методы конструктор (ы) конструктор копирования деструктор метод вывода информации о студенте. Определить класс Преподаватель (фамилия, предмет) с методом выставления оценки некотором студенту за определенную лабораторную работу. Продемонстрировать взаимодействие классов.

Я не могу понять зачем тут может понадобится конструктор копирования?Уже второе подобное задание.Я уже сколько думал, но в моем решении он только мешает.Может кто подсказать?

Answer 1

Оценки (динамический массив оценок)

Значит, вы выделяете память динамически, а в классе храните на нее указатель. Если вы не создаете копирующий конструктор - сгенерированный компилятором будет просто копировать этот указатель. И если вы не устраиваете утечку памяти, а освобождаете память в деструкторе - то в результате вы ее освободите два раза...

Вам надо неприятностей? Их есть у двойного освобождения памяти.

Та же ерунда будет и если вы ре реализуете оператор присваивания.

Можно запретить копирование и присваивание вообще - но это, скажем так, очень резко ограничит применимость вашего класса...

Answer 2

Что случится, если для класса, имеющего указатель или ссыльку, не определить конструктор копирования, оператор присваивания и деструктор?.. Пример:

class Student {
    static int k;
    unsigned* grade;
    //...
public:
    Student() : grade(new unsigned[20]) { ++k; cout << "Constructor" << k <<'\n';}
    ~Student() {   cout << "Destructor\n"; }
};
int Student::k = 0;
int main()
{       
    Student  s;     // вызывается конструктор (создается массив 1 в динамической области
    Student s2 = s; // копируется указатель ( оба указателья указывают на массив) 1
    Student s3;     // вызывается конструктор (создается массив 2 в динамической области
    s3 = s;         // копируется указатель, поэтому указатель s3 указывает на 1
    // получается что на массив созданный вызовом конструктора s3 ничего не указывет
    // и его нельзя уничтожить.
    // С другой стороны массив 1 уничтожается 3 раза
    return 0;
}

Это приведет к массу неприятносей

READ ALSO
ReaFile считать 0 байт

ReaFile считать 0 байт

Вопрос на теориюЕсть функция ОС ReadFile (https://msdn

192
Как установить флаги компилятор через cmake?

Как установить флаги компилятор через cmake?

столкнулся с проблемой, для компилирования программы надо указать gcc флаги -I -L -lТак вот не получается установить данные флаги в cmake

313
Как можно синхронизировать C++ и Python

Как можно синхронизировать C++ и Python

Всем привет! Столкнулся с такой необходимостью, у меня есть код, написанный на C++ это программа со статистикой(там диаграмма и графики)И есть...

205
Библиотеки для распознавания речи [требует правки]

Библиотеки для распознавания речи [требует правки]

Какие библиотеки лучше использовать? Какие книги, мануалы посоветуетеСпасибо

235