- •Классы, Объекты и Методы
- •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;
- •Цепочки методов класса
- •Заключение
Инициализация массивов в классе
Рассмотрим класс с массивом в качестве переменной-члена:
class Values {
private:
const int m_array[7];
};
До C++11 мы могли только обнулить массив через список инициализации:
class Values {
private:
const int m_array[7];
public:
Values(): m_array {} // обнуляем массив
{// Если мы хотим, чтобы массив имел значения, то мы должны здесь
//использовать присваивание
}
};
Однако в C++11 вы можете полностью инициализировать
массив, используя uniform-инициализацию:
class Values {
private:
const int m_array[7];
public:
Values(): m_array { 3, 4, 5, 6, 7, 8, 9 } // используем uniform-
//инициализацию для инициализации массива
{ }
};
Инициализация переменных-членов, которые являются классами
Список инициализации членов также может использоваться для инициализации членов, которые являются классами:
#include <iostream>
class A {
public:
A(int a) { std::cout << "A " << a << "\n"; }
};
class B {
private:
A m_a;
public:
B(int b)
: m_a(b-1) // вызывается конструктор A(int) для инициализации
// члена m_a
{ std::cout << "B " << b << "\n"; }
};
Int main() {
B b(7);
return 0;
}
Результат выполнения программы:
A 6
B 7
При создании переменной b вызывается конструктор B(int) со значением 7.
До того, как тело конструктора выполнится, инициализируется m_a, вызывая конструктор A(int) со значением 6.
Таким образом, сначала выведется A 6 .
Затем управление возвратится обратно к конструктору B(), и тогда уже он выполнится и выведется B 7.
Использование списков инициализации
Если список инициализации помещается на той же строке, что и имя конструктора, то лучше всё разместить в одной строке:
class Values {
private:
Int m_value1;
double m_value2;
char m_value3;
public:
Values() : m_value1(3), m_value2(4.5), m_value3('d') // всё находится
// в одной строке
{ }
};
Если список инициализации членов не помещается в строке с именем конструктора, то на следующей строке (используя перенос) инициализаторы должны быть с отступом:
class Values {
private:
Int m_value1;
double m_value2;
char m_value3;
public:
Values(int value1, double value2, char value3='d') // на этой строке
// уже и так много чего
: m_value1(value1), m_value2(value2), m_value3(value3) // поэтому //переносим инициализаторы на новую строку (не забываем //использовать отступ)
{ }
};
Если все инициализаторы не помещаются на одной строке, то вы можете выделить для каждого инициализатора отдельную строку:
class Values
{
private:
Int m_value1;
double m_value2;
char m_value3;
float m_value4;
public:
Values(int value1, double value2, char value3='d', float value4=17.5)
// на этой строке уже и так много чего,
:m_value1(value1), //поэтому выделяем каждому инициализатору
//отдельную строку, не забывая о запятой в конце
m_value2(value2),
m_value3(value3),
m_value4(value4)
{ }
};
