- •Классы, Объекты и Методы
- •Struct DateStruct {
- •Int month;
- •Int year;
- •Методы классов
- •Void print () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Спецификаторы доступа public и private
- •Int year; // открыто по умолчанию
- •Int main () {
- •Int main () {
- •Int main ()
- •Структуры. Классы
- •Инкапсуляция, Геттеры и Сеттеры Инкапсуляция
- •Int m_array[10];
- •Int main () {
- •IntArray array;
- •Void setValue(int index, int value) {
- •Функции доступа (геттеры и сеттеры)
- •Int m_month;
- •Int m_year;
- •Int main () {
- •Краткий обзор l-value и r-value
- •Инициализация ссылок
- •Ссылки в качестве параметров в функциях
- •Void changeN (int &ref) {
- •Int main () {
- •Int value1;
- •Int otherValue;
- •Ссылки. Указатели
- •Конструкторы
- •Int main () {
- •Конструкторы по умолчанию
- •Конструкторы с параметрами
- •Int m_numerator;
- •Int m_denominator;
- •Int getNumerator () {return m_numerator; }
- •Int getDenominator () {return m_denominator; }
- •Копирующая инициализация
- •Уменьшение количества конструкторов
- •Неявно генерируемый конструктор по умолчанию
- •Int main () {
- •Int main () {
- •Классы, содержащие другие классы
- •Int main() {
- •Список инициализации членов класса
- •Списки инициализации членов класса
- •Int m_value1;
- •Values() {
- •Int m_value1;
- •Инициализация массивов в классе
- •Инициализация переменных-членов, которые являются классами
- •Int main() {
- •Использование списков инициализации
- •Int m_value1;
- •Int m_value1;
- •Int m_value1;
- •Порядок выполнения в списке инициализации
- •Инициализация нестатических членов класса
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Делегирующие конструкторы
- •Void DoX() {
- •Init();
- •Init();
- •Void Init()
- •Int main() {
- •Ещё о делегирующих конструкторах
- •Деструкторы
- •Имена деструкторов
- •Пример использования деструктора на практике
- •Выполнение конструкторов и деструкторов
- •Int getId() { return m_nId; }
- •Int main() {
- •Предупреждение о функции exit()
- •Скрытый указатель this
- •Скрытый указатель *this
- •Int m_number;
- •Int getNumber() { return m_number; }
- •Int main() {
- •Указатель this всегда указывает на текущий объект. Явное указание указателя this
- •Int data;
- •Цепочки методов класса
- •Заключение
Int main() {
Something a; // a.m_length = 3.5, a.m_width = 3.5
a.print();
return 0;
}
Результат выполнения программы:
length: 3.5 and width: 3.5
Таким образом, вы предоставляете значения по умолчанию вашим переменным-членам, которые будут использоваться вашими конструкторами, если сами конструкторы не предоставят эти значения (через списки инициализации членов).
Однако конструкторы все еще определяют какие объекты, могут быть созданы, например:
#include <iostream>
class Something {
private:
double m_length = 3.5;
double m_width = 3.5;
public:
// Обратите внимание, здесь нет конструктора по умолчанию
Something(double length, double width):
m_length(length), m_width(width) {
// m_length и m_width инициализируются этим конструктором //(значения по умолчанию, приведенные выше, не используются!!!)
}
Void print() {
std::cout << "length: " << m_length << ", width: " << m_width << '\n';
}
};
Int main() {
Something a; // не скомпилируется, так как требуется конструктор по //умолчанию, даже если члены класса имеют значения по умолчанию!!!!
return 0;
}
Несмотря на то, что мы предоставили значения по умолчанию всем переменным-членам класса, конструктор по умолчанию предоставлен не был, поэтому мы не можем создать объект класса Something без параметров.
Если предоставлено значение по умолчанию, и конструктор инициализирует член через список инициализации членов, то приоритет будет у списка инициализации членов!!!:
#include <iostream>
class Something {
private:
double m_length = 3.5;
double m_width = 3.5;
public:
Something(double length, double width)
: m_length(length), m_width(width) {
// m_length и m_width инициализируются конструктором (значения по //умолчанию, приведенные выше, не используются)
}
Void print() {
std::cout << "length: " << m_length << " and width: " << m_width << '\n';
}
};
Int main() {
Something a(4.5, 5.5);
a.print();
return 0;
}
Результат выполнения программы:
length: 4.5 and width: 5.5
Правило: Используйте инициализацию нестатических членов для указания значений по умолчанию переменным-членам.
Задание №1
Добавьте в следующую программу инициализацию нестатических членов и список инициализации членов:
#include <string>
#include <iostream>
class Thing {
private:
std::string m_color;
double m_radius;
public:
// Конструктор по умолчанию без параметров
Thing() {
m_color = "blue";
m_radius = 20.0;
}
// Конструктор с параметром color (для radius предоставлено //значение по умолчанию)
Thing(const std::string &color) {
m_color = color;
m_radius = 20.0;
}
// Конструктор с параметром radius (для color предоставлено //значение по умолчанию)
Thing(double radius) {
m_color = "blue";
m_radius = radius;
}
// Конструктор с параметрами color и radius
Thing(const std::string &color, double radius) {
m_color = color;
m_radius = radius;
}
