Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекции 1-2.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
142.98 Кб
Скачать

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;

}