Конструктор по умолчанию

Конструктор по умолчанию (англ. default constructor), в объектно-ориентированных языках программирования — конструктор, который может быть вызван без аргументов.

В C++ и Java, если нет явным образом определённых конструкторов в классе, то компилятор использует конструктор по умолчанию, определённый неявным способом, и обычно является конструктором, не имеющим аргументов (nullary constructor). Если программист явно указал только конструктор с параметрами, то компилятор не будет создавать конструктор по умолчанию.

В C++ и Java, если производный класс не вызывает явным образом конструктор базового класса (в C++ в списке инициализации, в Java используя super() в первой строчке), то конструктор по умолчанию вызывается неявно.

C++

В C++, стандарт описывает конструктор по умолчанию как конструктор, который может быть вызван без передачи аргументов (включая конструктор с параметрами, имеющими значение по умолчанию).[1] Например:

class MyClass
{
public:
    MyClass();  // конструктор описан

private:
    int x;
};

MyClass :: MyClass() : x(100)  // конструктор определён
{
}

int main()
{
    MyClass m;  // во время работы программы создаётся объект m И вызывается конструктор по умолчанию
}

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

int main()
{
    MyClass * pointer = new MyClass();  // во время работы (рантайм) объект создаётся, и
                                        // вызывается конструктор по умолчанию
}

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

class MyClass
{
public:
    MyClass (int i = 0, std::string s = "");  // конструктор описан (прототип)

private:
    int x;
    int y;
    std::string z;
};

MyClass :: MyClass(int i, std::string s)     // конструктор определён
{
    x = 100;
    y = i;
    z = s;
}

В C ++ конструкторы по умолчанию имеют существенное значение, поскольку они автоматически вызываются при определенных обстоятельствах, и, следовательно, при определённых условиях класс обязан иметь конструктор по умолчанию, иначе возникнет ошибка:

  • Когда объект объявляется без аргументов (например, MyClass x;) или создаётся новый экземпляр в памяти (например, new MyClass; или new MyClass();).
  • Когда объявлен массив объектов, например, MyClass x[10];; или объявлен динамически, например new MyClass [10]. Конструктор по умолчанию инициализирует все элементы.
  • Когда в классе потомке не указан явно конструктор класса родителя в списке инициализации.
  • Когда конструктор класса не вызывает явно конструктор хотя бы одного из своих полей-объектов в списке инициализации.
  • В стандартной библиотеке определённые контейнеры заполняют свои значения используя конструкторы по умолчанию, если значение не указано явно. Например, vector<MyClass>(10); заполняет вектор десятью элементами, инициализированными конструктором по умолчанию.

Если в классе не определён конструктор по-умолчанию, компилятор неявно создаст его. Он будет аналогичен явно объявленному конструктору с пустым телом. Напримeр:[2]

class MyClass
{
    int x;
};

int main()
{
    MyClass m;   // ошибки во время работы программы нет, вызывается неявный конструктор
}

Если определены конструкторы для класса, но среди них нет конструктора по умолчанию, компилятор не создаст неявно таковой. Это приводит к ошибкам, как в этом примере:

class MyClass
{
public:
    MyClass (int y);  // объявление конструктора не по умолчанию

private:
    int x;
};

MyClass :: MyClass (int y)
{
    x = y;
}

int main()
{
    MyClass m(100);     // вызывается конструктор не по умолчанию
    MyClass * p;        // при объявлении указателя компилятору не нужно знать о конструкторах
    p = new MyClass();  // ошибка во время компиляции: нет конструктора по умолчанию
    return 0;
}

Создание объекта на который указывает p приведёт также к ошибке.[2]

С другой стороны, с C++11 конструктор по умолчанию может быть явно указан:

class MyClass
{
public:
    MyClass () = default;  // force generation of a default constructor
};

Или явно удалён:

class MyClass
{
public:
    MyClass () = delete;  // prevent generation of default constructor
};

Java

class DefaultConstructor {

 int a = 10;

 public int getInt() {
  return a;
 }

}

class Main {

  public static void main(String[] args) {
     
    DefaultConstructor Dc = new DefaultConstructor();//Конструктор по умолчанию
    System.out.println( Dc.getInt() );

  }

} // Неверно!

Примечания

  1. C++ standard, ISO/IEC 14882:1998, 12.1.5
    C++ standard, ISO/IEC 14882:2003, 12.1.5
  2. Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.