C ++, Копировать объявление / определение конструктора - PullRequest
2 голосов
/ 25 декабря 2010

Если какой-то класс НЕ выполняет динамическое выделение памяти, достаточно только объявить конструктор копирования?

См. Следующий пример, пожалуйста

Вместо:

class A
{
    protected :
            int a;
    public:
            A(const A &source)
            {
                    a = source.a;
            }


};

class B: public A
{
    protected :
            int b;
    public:
            B(const B &source): A(source)
            {
                    b = source.b;
            }
};

use:

class A
{
    protected :
            int a;
    public:
            A(const A &source);

};

class B: public A
{
    protected :
            int b;
    public:
            B(const B &source);

};

Может ли второй вариант иногда вызывать проблемы?Некоторый пример будет полезным.

Ответы [ 3 ]

5 голосов
/ 25 декабря 2010

В случаях, когда простая копия каждого элемента будет выполнять свою задачу, т. Е. Когда у вас нет указателей, которые нужно глубоко копировать, и нет другого поведения в конструкторе, кроме инициализации переменных, вы не можетевообще не нужно объявлять конструктор копирования.Реализация по умолчанию сделает это за вас.

4 голосов
/ 25 декабря 2010

Лучше всего не определять и не объявлять конструктор копирования, сгенерированный компилятором будет работать нормально.

Если вы объявите конструктор копирования, компилятор больше не предоставит его, и вы получите ошибки компоновщика, если вы его используете, но не написали для него тело функции.

3 голосов
/ 25 декабря 2010

Второй пример должен выдать ошибку компоновщика, поскольку конструктор копирования объявлен, но не определен. Это не должно быть объявлено вообще. Если он объявлен, он также должен быть определен, и тогда классу также понадобятся пользовательский деструктор и оператор присваивания (закон большой тройки).

...