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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

В C++ и Java, если нет явным образом определённых конструкторов в классе, то компилятор использует конструктор по умолчанию, определённый неявным способом, который аналогичен «чистому»[уточнить] конструктору по умолчанию. Если программист явно указал только конструктор с параметрами, то компилятор не будет создавать конструктор по умолчанию.

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

C++[править | править вики-текст]

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

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

private:
    int x;
};

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

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

Когда динамически выделяется память под объект, конструктор может быть вызван при помощи добавления пустых скобок после имени класса When allocating memory dynamically, the constructor may be called by adding parenthesis after the class name. В некотором смысле, это явный вызов конструктора:

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. 1 2 Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg