Конструктор — это специальный метод класса, который автоматически вызывается при создании объекта. Основные задачи конструктора:
Вызывается без аргументов. Если не определен явно, компилятор генерирует его автоматически.
class Example {
public:
Example() { // Конструктор по умолчанию
std::cout << "Default constructor called";
}
};
int main() {
Example obj; // Вызов конструктора по умолчанию
}
Особенности:
= default
Принимает параметры для инициализации объекта.
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) { // Список инициализации
std::cout << "Parametrized constructor";
}
};
int main() {
Point p(10, 20); // Вызов параметризованного конструктора
}
Создает объект как копию существующего объекта. Сигнатура: T(const T&)
.
class Buffer {
char* data;
size_t size;
public:
Buffer(const Buffer& other) : size(other.size) {
data = new char[size];
std::copy(other.data, other.data + size, data);
}
};
int main() {
Buffer buf1;
Buffer buf2 = buf1; // Вызов конструктора копирования
}
Особенности:
Принимает rvalue-ссылку для "перехвата" ресурсов временного объекта.
class String {
char* data;
public:
String(String&& other) noexcept : data(other.data) {
other.data = nullptr; // Важно оставить в валидном состоянии
}
};
int main() {
String s1 = createString(); // Вызов конструктора перемещения
}
Может вызывать другой конструктор того же класса.
class Widget {
int type;
std::string name;
public:
Widget(int t) : type(t), name("Unknown") {}
Widget(int t, const std::string& n) : Widget(t) { // Делегирование
name = n;
}
};
Запрещает неявные преобразования.
class Array {
int size;
public:
explicit Array(int s) : size(s) {}
};
void foo(Array a) {}
int main() {
Array a = 10; // Ошибка: explicit запрещает неявное преобразование
Array a(10); // OK
foo(10); // Ошибка
}
Позволяет неявное преобразование типов (без explicit).
class Rational {
int num, denom;
public:
Rational(int n) : num(n), denom(1) {} // Конструктор преобразования
};
void printRational(Rational r) {}
int main() {
printRational(5); // Неявное преобразование int → Rational
}
Для инициализации списками.
class Vector {
std::vector<int> data;
public:
Vector(std::initializer_list<int> list) : data(list) {}
};
int main() {
Vector v = {1, 2, 3, 4};
}
Резюмируем: конструкторы — ключевой механизм инициализации объектов в C++. Понимание различных типов конструкторов и их особенностей критически важно для написания корректных и эффективных программ на C++.