компилятор генерировал конструкторов [дубликат]

Этот вопрос уже имеет ответ здесь:

Это - просто быстрый вопрос понять правильно, что происходит, когда Вы создаете класс с конструктором как это:

class A
{
  public:
    A() {}
};

Я знаю, что никакой конструктор по умолчанию не сгенерирован, так как это уже определяется, но копия, и конструкторы присвоения сгенерированы компилятором, или другими словами я должен объявить частного конструктора копии и частный оператор присваивания для предотвращения этого?

class A
{
  private:
    // needed to prevent automatic generation?
    A( const A& );
    A& operator=( const A& );
  public:
    A() {}
};
11
задан Peter Alexander 4 March 2010 в 16:14
поделиться

3 ответа

Да. Конструктор копирования, оператор присваивания и деструктор всегда создаются независимо от других конструкторов и операторов.

Если вы хотите отключить один, то то, что у вас есть, идеально. Это тоже довольно распространено.

12
ответ дан 3 December 2019 в 03:35
поделиться

Да, конструктор копирования и операторы присваивания копии по-прежнему создаются, даже если вы объявляете свой собственный конструктор по умолчанию.

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

Обратите внимание, что возможно иметь как собственный конструктор копирования, так и предоставленный компилятором:

struct A {
  A() { }
  A(A const&, int foo); 
}; // compiler declares a copy constructor now

// make the second parameter have a default argument
// now this constructor is a copy constructor too. 
inline A::A(A const&, int foo = 0) {

}

int main() {
  A a;
  A b = a; // ambiguity between compiler's one and our custom one!
}

Стандарт, однако, позволяет компиляторам принимать этот код, но эффект аналогичен неопределенному поведению: Программа плохо работает. сформирован, но для этой программы не требуется никаких предупреждений / ошибок. (ранние версии GCC не отвергают этот код, последние отвергают его).

13
ответ дан 3 December 2019 в 03:35
поделиться

Если вы хотите запретить копирование и присваивание, то лучше наследоваться от класса, который имеет приватный конструктор копирования и оператор присваивания (boost::noncopyable - готовый).

1) Меньше повторяющегося набора текста.

2) Самодокументирование (надеюсь).

3) Более сильные проверки того, что эти операции не могут быть вызваны (сам класс и его друзья тоже не могут создавать копии - это приведет к ошибке компилятора, а не компоновщика).

4) Не будет скрывать конструктор по умолчанию :)

#include <boost/noncopyable.hpp>

class X : boost::noncopyable
{
};

int main()
{
    X a, b;     //has default constructor
    //X c(a);   //but can't be copied
    //a = b;    //or assigned
}
2
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: