#include
#include
using namespace std;
class Human
{
private:
string Name;
int Age;
9:
friend class Utility;
1 1 :
public:
Human(string InputName, int InputAge)
{
Name = InputName;
Age = InputAge;
}
class Utility
{
public:
1:: static void DisplayAge(const Human& Person)
{
I:: cout « Person.Age « endl;
}
};
1?: int main()
Human FirstMan("Adam", 25);
31:
|
cout «
|
"Accessing private member Age via friend class: ";
|
3
|
2:
|
Utility::DisplayAge(FirstMan);
|
3::
|
return
|
0;
|
31:
|
}
|
|
|
Результат
Accessing private member Age via friend class: 25
Анализ
Строка 10 объявляет класс U t i l i t y дружественным классу Human. Это позволяет всем методам класса U t i l i t y обращаться даже к закрытым переменным -членам и методам класса Human.
Резюме
Это занятие познакомило вас с одной из самых фундаментальных концепций язь!ка C++ — классом и ключевым словом c l a s s . Вы узнали, что класс инкапсулирует данные-члены и функции-члены для их использования. Было показано, что такие модификаторы доступа, как p u b l i c и p r i v a t e , позволяют абстрагировать данные и функции, которые сущностям вне класса не нужно видеть.
Вы изучили концепцию конструкторов копий и то, как с помощью конструкторов пе ремещения компилятор C++11 позволяет оптимизировать случаи нежелательных этапов копирования. Мы также рассмотрели некоторые частные случаи, где все эти элементы объединяются, позволяя реализовать такие шаблоны проектирования, как “синглетон”.
Вопросы и ответы
■ В чем разница между экземпляром класса и объектом того же класса?
По существу, никакой. Когда вы создаете экземпляр класса, вы получаете объект.
244 ЗАНЯТИЕ 9. Классы и объекты
К ак лучш е получить доступ к члену: используя точечный оператор ( .) или опера тор указателя (->)?
Если у вас есть указатель на объект, то лучше использовать оператор указателя. Если объект создан в стеке как локальная переменная, то лучше подойдет точечный оператор.
Должен ли я всегда создавать конструктор копий?
Если среди переменных-членов вашего класса есть интеллектуальные указатели, стро ковые классы или контейнеры STL, такие как s td : : vecto r, то стандартный конструк тор копий, предоставляемый компилятором, гарантирует вызов их конструкторов ко пий. Однако, если среди членов вашего класса есть простой указатель (такой как in t* для динамического массива вместо s td : :v e c to r< in t> ), необходимо предоставить конструктор копий, гарантирующий глубокое копирование массива при вызове функ ции, которой объект класса передается по значению.
У моего класса есть только один конструктор, парам етр которого бы л определен со значением по умолчанию . Это все еще стандартны й конструктор?
Да. Если экземпляр класса может быть создан без аргументов, то считается, что у клас са есть стандартный конструктор. У класса может быть только один стандартный кон структор.
Почему некоторые примеры данного занятия используют такие функции, как S e tA g e () для установки значения таки х перем енны х, к ак Human: :A ge? П очему бы не сделать переменную Аде откры той и не присваивать ей значение, когда нужно?
С технической точки зрения открытая переменная-член Human: : Age также вполне ра ботоспособна. Однако с точки зрения проекта данные-члены имеет смысл оставить за крытыми. Функции доступа, такие как GetAge () или SetA ge (), являются корректным и рекомендуемым способом доступа к этим закрытым данным, позволяя выполнять проверки на ошибки прежде, чем, например, значение переменной Human: : Age будет установлено или удалено.
Почему конструктору копий в качестве парам етра по ссылке передается оригинал?
Прежде всего, такого конструктора копий ожидает компилятор. Причина в том, что кон структор копий вызвал бы сам себя, если бы получил оригинал по значению, что при вело бы к бесконечному циклу копирования.
Коллоквиум
этом разделе предлагаются вопросы для самоконтроля и закрепления полученных знаний, а также упражнения, которые помогут применить на практике полученные навы ки. Попытайтесь самостоятельно ответить на эти вопросы и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г, “Ответы”. Если остались не ясными хотя бы некоторые из предложенных ниже вопросов, не приступайте к изучению материала следующего занятия.
Do'stlaringiz bilan baham: |