Неявный и явный конструктор С++
Знаете ли вы, что существуют как явные, так и неявные конструкторы?
Давайте рассмотрим разницу между ними, когда их можно использовать в своём коде, чтобы код был более читаемым.
В некоторых компиляторах 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 *, таким образом, позволяет этой инициализации быть действительной.
Заключение
Понимание неявных и явных конструкторов позволит Вам полностью контролировать читабельность и использование своего кода. Это особенно важно учитывать, если Вы просматриваете чужой код или читаете код из библиотеки.