#include
using namespace std;
2 :
class Human
{
private:
// Закрытые данные-члены:
int Age;
:
public:
void SetAge(int InputAge)
11: {
Age = InputAge;
}
14:
// Человек лжет о своем возрасте (если ему за 30)
int GetAgeO
{
if (Age > 30)
return (Age - 2);
else
return Age;
22: }
};
int main()
{
Human FirstMan;
FirstMan.SetAge(35);
Human FirstWoman;
FirstWoman.SetAge(22);
cout « "Age of FirstMan " « FirstMan.GetAge() « endl;
cout « "Age of FirstWoman " « FirstWoman.GetAge() « endl;
return 0;
}
Результат
Age of FirstMan 33
Age of FirstWoman 22
Анализ
Обратите внимание на открытый метод Human: : G et Age () в строке 16. П осколь ку фактический возраст, содержавшийся в закрытой целочисленной переменной-члене Human: : Age, недоступен непосредственно, единственным способом для внешнего поль зователя объекта класса Human обратиться к его атрибуту Аде является метод G et Аде (). Таким образом, фактический возраст, содержащийся в переменной-члене Human: :Age, абстрагируется от внешнего мира.
Абстракция (abstraction) — это очень важная концепция объектно-ориентированных 13ыков. Она позволяет программистам решать, какие атрибуты класса должны оставаться известными только самому классу и его членам, но никому вовне (за исключением его "друзей”).
Конструкторы
Конструктор (constructor) — это специальная функция (или метод), вызываемая при создании объекта. Так же как и функции, конструкторы могут быть перегружены.
Объявление и реализация конструктора
Конструктор — это специальная функция, имя которой совпадает с именем класса и не имеет возвращаемого значения. Так, у класса Human есть конструктор, который объяв ляется так:
class Human
{
public:
Human(); // объявление конструктора
};
Конструктор может быть реализован в классе или вне объявления класса. Реализация «определение) в классе выглядит следующим образом:
class Human
{
public:
Human()
{
// код конструктора здесь
};
Вариант определения конструктора вне объявления класса выглядит следую щ им образом:
class Human
{
public:
Human(); // объявление конструктора
};
определение конструктора (реализация) Human::Human()
{
код конструктора здесь
212 ЗАНЯТИЕ 9. Классы и объекты
Оператор :: называется оператором области видимости (scope resolution
operator). Например, синтаксис Human:: DateOfBirth относится к переменной
DateOfBirth, объявленной в пределах класса Human. Синтаксис :: DateOf Birth, напротив, относится к другой переменной DateOfBirth, объявленной в глобальной области видимости.
Когда и как использовать конструкторы
Конструктор всегда вызывается при создании объекта. Это делает конструктор наи лучшим местом для инициализации исходными значениями переменных-членов класса, таких как целые числа, указатели и т.д. Вернемся к листингу 9.2. Обратите внимание: если бы вы забыли вызвать метод S e t Аде (), то целочисленная переменная Human:: Аде содер жала бы неизвестное случайное значение, поскольку эта переменная не была инициали зирована (попробуйте, что получится, закомментировав строки 28 и 31). Для реализации улучшенной версии класса Human, где переменная Аде инициализируется, в листинге 9.3 используется конструктор.
ЛИСТИНГ 9.3. Использование конструктора для инициализации переменных-членов класса
#include
#include
using namespace std;
class Human
{
private:
// Закрытые данные-члены:
string Name;
int Age;
1 0 :
public:
// конструктор
Human ()
14:
Age =0; // инициализация гарантирует отсутствие
случайного значения
cout « "Constructed an instance of class Human" « endl;
void SetName (string HumansName)
Name = HumansName;
23
void SetAge(int HumansAge)
Age = HumansAge;
void IntroduceSelf()
Конструкторы 213
{
1:
|
cout
|
«
|
"I am
|
" + Name
|
« " and am ";
|
2:
|
cout
|
«
|
Age «
|
" years
|
old" « endl;
|
}
};
int main()
{
Human FirstMan;
FirstMan.SetName("Adam");
FirstMan.SetAge(30);
Human FirstWoman;
FirstWoman.SetName("Eve");
FirstWoman.SetAge (28);
FirstMan.IntroduceSelf();
~ : FirstWoman.IntroduceSelf();
Результат
Constructed an instance of class Human
Constructed an instance of class Human
I am Adam and am 30 years old
I am Eve and am 28 years old
Анализ
выводе вы видите добавление двух весьма уместных первых строк по сравнению
листингом 9.1. Теперь обратите внимание на функцию m ain (), определенную в стро ках 36-48. Вы видите, что эти две строки были созданы косвенно при создании двух объектов F irs tM a n и F irstW om an в строках 38 и 42. Поскольку эти два объекта имеют тип класса Human, их создание автоматически привело к выполнению конструктора класса Human, определенного в строках 13-17. У этого конструктора есть оператор c o u t, создав ший этот вывод. Кроме того, конструктор также инициализирует нулем целочисленную переменную Аде. Если вы забудете установить возраст недавно созданного объекта, то можете быть уверены, что конструктор обеспечит ему не произвольное целочисленное значение (которое могло бы выглядеть правильным), а значение нуль, означающее неудачу установки атрибута класса Human:: Age.
ПРИМЕЧАНИЕ
Конструктор, который может быть вызван без аргумента, называется стандарт ным конструктором (default constructor). Собственноручно создавать стандарт ный конструктор необязательно.
Если вы не создали конструктор сами, как в листинге 9.1, то компилятор предо ставит его автоматически (он создает переменные-члены класса, но не инициа лизирует простые старые типы данных, такие как int).
214 ЗАНЯТИЕ 9. Классы и объекты
Перегрузка конструкторов
Поскольку конструкторы могут быть перегружены как функции, вполне можно полу чить конструктор, позволяющий создать объект класса Human, с именем в качестве пара метра, например:
class Human
{
public:
Human()
{
// здесь код стандартного конструктора
Human(string HumansName)
{
// здесь код перегруженного конструктора
}
};
Листинг 9.4 демонстрирует применение перегруженных конструкторов при создании объекта класса Human с предоставленным именем.
И С Т И Н Г 9 .4 , Класс Human с несколькими конструкторами___________________________________
Do'stlaringiz bilan baham: |