- •Классы, Объекты и Методы
- •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 () {
DateStruct date;
date.day = 12;
date.month = 11;
date.year = 2018;
return 0;
}
Здесь мы объявляем структуру DateStruct, а затем напрямую обращаемся к её членам для их инициализации. Это работает, так как все члены структуры являются открытыми по умолчанию.
Открытые члены (или «public-члены») — это члены структуры или класса, к которым можно получить доступ извне этой же структуры или класса.
В программе, приведенной выше, функция main () находится вне структуры, но она может напрямую обращаться к членам day, month и year, так как они являются открытыми.
С другой стороны, рассмотрим класс:
class DateClass // члены класса являются закрытыми по умолчанию
{
int m_day; // закрыто по умолчанию
int m_month; // закрыто по умолчанию
int m_year; // закрыто по умолчанию
};
Int main () {
DateClass date;
date.m_day = 12; // ошибка
date.m_month = 11; // ошибка
date.m_year = 2018; // ошибка
return 0;
}
Вам бы не удалось скомпилировать эту программу, так как все члены класса являются закрытыми по умолчанию.
Закрытые члены (или «private-члены») — это члены класса, доступ к которым имеют только другие члены этого же класса.
Поскольку функция main () не является членом DateClass, то она и не имеет доступа к закрытым членам объекта date.
Хотя члены класса являются закрытыми по умолчанию, мы можем сделать их открытыми, используя ключевое слово public:
class DateClass {
public: // обратите внимание на ключевое слово public и двоеточие
int m_day; // открыто, доступ имеет любой объект
int m_month; // открыто, доступ имеет любой объект
int m_year; // открыто, доступ имеет любой объект
};
int main() {
DateClass date;
date.m_day = 12; //так как m_day имеет спецификатор доступа public
date.m_month = 11; //так как m_month имеет специф. доступа public
date.m_year = 2018; //так как m_year имеет специф. доступа public
return 0;
}
Поскольку теперь члены класса DateClass являются открытыми, то к ним можно получить доступ напрямую из функции main().
Ключевое слово public вместе с двоеточием называется спецификатором доступа.
Каждый из членов «приобретает» уровень доступа в соответствии со спецификатором доступа (или, если он не указан, в соответствии со спецификатором доступа по умолчанию).
В языке C++ есть 3 уровня доступа:
спецификатор public делает члены открытыми;
спецификатор private делает члены закрытыми;
спецификатор protected открывает доступ к членам только для дружественных и дочерних классов (детально об этом на соответствующем уроке).
Использование спецификаторов доступа
Классы могут использовать (и активно используют) сразу несколько спецификаторов доступа для установки уровней доступа для каждого из своих членов.
Обычно переменные-члены являются закрытыми, а методы — открытыми.
Правило: Устанавливайте спецификатор доступа private переменным-членам класса и спецификатор доступа public — методам класса (если у вас нет веских оснований делать иначе).
Рассмотрим пример класса, который использует спецификаторы доступа private и public:
#include <iostream>
class DateClass // члены класса закрытые по умолчанию
{
int m_day; // закрыто по умолчанию
int m_month; // закрыто по умолчанию
int m_year; // закрыто по умолчанию
public:
void setDate (int day, int month, int year) // метод открыт
{
// Метод setDate () имеет доступ к закрытым членам класса, так как //сам является членом класса
m_day = day;
m_month = month;
m_year = year;
}
void print() // открыт, доступ имеет любой объект программы
{
std::cout << m_day << "/" << m_month << "/" << m_year;
}
};
