- •Классы, Объекты и Методы
- •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 () {
Boo boo1 = {7, 8 }; // список инициализаторов
Boo boo2 {9, 10}; // uniform-инициализация (C++11)
return 0;
}
Однако, как только мы сделаем какие-либо переменные-члены класса закрытыми, то больше не сможем инициализировать их напрямую.
Если вы не можете напрямую обращаться к переменной (потому что она закрыта), то вы и не должны иметь возможность напрямую её инициализировать.
Как тогда инициализировать класс с закрытыми переменными-членами?
Использовать конструкторы.
Конструктор — это особый тип метода класса, который автоматически вызывается при создании объекта этого класса.
Конструкторы обычно используются
- для инициализации переменных-членов класса значениями, которые предоставлены по умолчанию/пользователем, или
- для выполнения любых шагов настройки, необходимых для используемого класса (например, открыть определенный файл или базу данных).
В отличие от обычных методов, конструкторы имеют определенные правила их именования:
- конструкторы всегда должны иметь то же имя, что и класс (учитываются верхний и нижний регистры);
- конструкторы не имеют типа возврата (даже void).
Обратите внимание, конструкторы предназначены только для выполнения инициализации (той или иной).
Не следует пытаться вызывать конструктор для повторной инициализации существующего объекта!
То есть, явно нельзя вызывать конструктор!
Хотя это может и скомпилироваться без ошибок, результаты при этом могут получиться неожиданные (компилятор создаст временный объект, а затем удалит его).
Инициализация переменных в С++
При определении переменной мы можем присвоить ей значение в момент выделения ей памяти. Это называется инициализацией переменной.
Существует 3 способа инициализации переменной в С++.
• Способ №1: Копирующая инициализация (или «инициализация копированием») с помощью знака равенства =:
int x = 5; // копирующая инициализация
• Способ №2: Прямая инициализация с помощью круглых скобок ():
int x(5); // прямая инициализация
• Способ №3: Uniform инициализация с помощью фигурных скобок {}:
int x{5}; // uniform инициализация
Прямая или копирующая инициализация работают не со всеми типами данных (например, вы не сможете использовать эти способы для инициализации списка значений).
В попытке обеспечить единый механизм инициализации, который будет работать со всеми типами данных, в C++11 добавили uniform-инициализацию.
В uniform-инициализации есть одно важное преимущество: вы не сможете присвоить переменной значение, которое не поддерживает её тип данных — компилятор выдаст предупреждение или сообщение об ошибке. Например:
int x{4.3}; // ошибка компилятора
Однако, если вы уже создали переменную и хотите присвоить ей значение (не в момент определения), то будет работать только присваивание:
int x;
x = 4;
В одном выражении можно определить сразу несколько переменных одного и того же типа данных, разделяя их имена запятыми. Кроме того, вы даже можете инициализировать несколько переменных в одной строке:
int a = 1, b = 2;
int c (3), d(4);
int e{5}, f{6}, g{};
Где лучше определять и инициализировать переменные?
Сейчас это неактуально. Современные компиляторы не требуют, чтобы все переменные обязательно были объявлены в самом верху функции.
В языке С++ приоритетным является определение, а также инициализация переменных как можно ближе к их первому использованию.
