Неявный и явный конструктор С++

Неявный и явный конструктор С++

Знаете ли вы, что существуют как явные, так и неявные конструкторы?

Давайте рассмотрим разницу между ними, когда их можно использовать в своём коде, чтобы код был более читаемым.

Явный конструктор

В некоторых компиляторах C++ вы можете увидеть предупреждения о необходимости указании явного конструктора.

Давайте рассмотрим пример явного конструктора:

#include <iostream> class MyClass { int num; public: explicit MyClass(int i) : num(i) {} int getNum() const { return num; } }; int main() { auto clz = MyClass(2); std::cout << clz.getNum()<<std::endl<<std::endl; system("pause"); return 0; }

Вы должны инициализировать объект данного класса, конструктором этого класса с установленным значением параметра.

Неявный конструктор

Эти конструкторы позволяют инициализировать значение класса без указания имени класса.

Давайте посмотрим на пример:

#include <iostream> class MyClass { int num; public: MyClass(int i) : num(i) {} int getNum() const { return num; } }; int main() { MyClass clz = 2; std::cout << clz.getNum()<<std::endl<<std::endl; system("pause"); return 0; }

Компилятор C++ смог неявно вызвать конструктор, и разрешил присвоить объекту целочисленное значение.

Исходя из выше сказанного данный код имеет право на жизнь.

std::string my_string = "Wow, this is cool!";

Объяснить это можно тем, что существует неявный конструктор с std::string, который принимает в параметрах const char *, таким образом, позволяет этой инициализации быть действительной.

Заключение

Понимание неявных и явных конструкторов позволит Вам полностью контролировать читабельность и использование своего кода. Это особенно важно учитывать, если Вы просматриваете чужой код или читаете код из библиотеки.

22
5 комментариев

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

1
Ответить

using std::string;

Ответить

Так чего там костылить, одной строчкой подключается

Ответить