- •Классы, Объекты и Методы
- •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 ()
{
DateClass date;
date.setDate (12, 11, 2018); // правильно, так как setDate() имеет //спецификатор доступа public
date.print (); // правильно, так как print () имеет спецификатор доступа public
return 0;
}
Результат выполнения программы:
12/11/2018
Обратите внимание, хоть мы и не можем получить доступ к переменным-членам объекта date напрямую из main () (так как они являются private по умолчанию), мы можем получить доступ к ним через открытые методы setDate () и print ()!
Открытые члены классов составляют открытый (или «public»)
интерфейс.
Поскольку доступ к открытым членам класса может осуществляться извне класса, то открытый интерфейс и определяет, как программы будут взаимодействовать с вашим классом.
Рассмотрим следующую программу:
#include <iostream>
class DateClass // члены класса закрыты по умолчанию
{
int m_day; // закрыто по умолчанию
int m_month; // закрыто по умолчанию
int m_year; // закрыто по умолчанию
public:
void setDate (int day, int month, int year) {
m_day = day;
m_month = month;
m_year = year;
}
void print () {
std::cout << m_day << "/" << m_month << "/" << m_year;
}
// Обратите внимание на этот дополнительный метод
void copyFrom (const DateClass &b) {
// Мы имеем прямой доступ к закрытым членам объекта b
m_day = b.m_day;
m_month = b.m_month;
m_year = b.m_year;
}
};
int main () {
DateClass date;
date.setDate (12, 11, 2018); // правильно, так как setDate () имеет //спецификатор доступа public
DateClass copy;
copy.copyFrom(date); // оправильно, так как copyFrom() имеет //спецификатор доступа public
copy.print();
return 0;
}
Один нюанс в языке C++, который часто игнорируют/ забывают/неправильно понимают, заключается в том, что контроль доступа работает на основе класса, а не на основе объекта.
Это означает, что, когда метод имеет доступ к закрытым членам класса, он может обращаться к закрытым членам любого объекта этого класса.
В примере, приведенном выше, метод copyFrom () является членом класса DateClass, что открывает ему доступ к private-членам класса DateClass.
Это означает, что copyFrom () может не только напрямую обращаться к закрытым членам неявного (своего) объекта, но и имеет прямой доступ к закрытым членам объекта b класса DateClass!
Это полезно, когда нужно скопировать элементы из одного объекта класса в другой объект того же класса. Детально об этом мы вспомним чуть позже.
Структуры. Классы
Теперь, когда мы узнали о спецификаторах доступа, мы можем поговорить о фактических различиях между классом и структурой в языке C++.
Класс по умолчанию устанавливает всем своим членам спецификатор доступа private.
Структура же по умолчанию устанавливает всем своим членам спецификатор доступа public.
Есть еще одно незначительное отличие: структуры наследуют от других конструкций языка С++ открыто, в то время как классы наследуют закрыто.
Вопросы
a) Что такое открытый член?
b) Что такое закрытый член?
c) Что такое спецификатор доступа?
d) Сколько есть спецификаторов доступа в языке C++? Назовите их.
Задание1
a) Напишите простой класс с именем Numbers. Этот класс должен иметь:
- три закрытые переменные-члены типа double: m_a, m_b и m_c;
- открытый метод с именем setValues (), который позволит устанавливать значения для m_a, m_b и m_c;
- открытый метод с именем print (), который будет выводить объект класса Numbers в следующем формате: < m_a, m_b, m_c>
Следующий код функции main ():
int main () {
Numbers point;
point.setValues(3.0, 4.0, 5.0);
point.print();
return 0;
}
Должен выдавать следующий результат:
<3, 4, 5>
b) Добавьте функцию isEqual() в класс Numbers, чтобы следующий код работал корректно:
int main () {
Numbers point1;
point1.setValues(3.0, 4.0, 5.0);
Numbers point2;
point2.setValues(3.0, 4.0, 5.0);
if (point1.isEqual(point2))
std::cout << "point1 and point2 are equal\n";
else
std::cout << "point1 and point2 are not equal\n";
Numbers point3;
point3.setValues(7.0, 8.0, 9.0);
if (point1.isEqual(point3))
std::cout << "point1 and point3 are equal\n";
else
std::cout << "point1 and point3 are not equal\n";
return 0;
}
