#include
#include
using namespace std;
3:
class Human
{
private:
// Закрытые данные-члены:
string Name;
int Age;
:
public:
// конструктор
Human()
{
Age =0; // инициализация гарантирует отсутствие
случайного значения
16: cout « "Default constructor creates an instance of Human"
endl;
}
// перегруженный конструктор, получающий Name
Human(string HumansName)
21: {
Name = HumansName;
Age =0; // инициализация гарантирует отсутствие
случайного значения
cout « "Overloaded constructor creates " « Name « endl;
}
Конструкторы 215
1‘: // перегруженный конструктор, получающий Name и Аде
Human(string HumansName, int HumansAge)
12: {
2:: Name = HumansName;
Age = HumansAge;
cout « "Overloaded constructor creates ";
22: cout « Name « " of " « Age « " years" « endl;
}
void SetName (string HumansName)
{
Name = HumansName;
22:}
void SetAge(int HumansAge)
{
Age = HumansAge;
}
void IntroduceSelf()
4~:{
cout « "I am " + Name « " and am ";
cout « Age « " years old" « endl;
:3:}
int main ()
{
Human FirstMan; // использование стандартного конструктора
FirstMan.SetName ("Adam");•
FirstMan.SetAge(30);
53
Human FirstWoman ("Eve"); // использование перегруженного
конструктора
FirstWoman.SetAge (28);
61
Human FirstChild ("Rose", 1);
FirstMan.IntroduceSelf() ;
FirstWoman.IntroduceSelf();
FirstChild.IntroduceSelf();
Результат
Default constructor creates an instance of Human
Overloaded constructor creates Eve
Overloaded constructor creates Rose of 1 years
I am Adam and am 30 years old
I am Eve and am 28 years old
I am Rose and am 1 years old
216 ЗАНЯТИЕ 9. Классы и объекты
Анализ
Адам создается с использованием стандартного конструктора; Ева — с использова нием перегруженного конструктора, который в виде параметра принимает строку, при сваиваемую переменной-члену Human: : Name, тогда как Роза создается с использовани ем третьего перегруженного конструктора, получающего в качестве параметров строку и число, присваиваемое переменной-члену Human: : Age. Эта программа демонстрирует, что перегрузка конструкторов может оказаться весьма полезной, помогая инициализировать переменные.
СОВЕТ Вы можете решить не реализовать стандартный конструктор, чтобы заставить создавать экземпляры объектов с определенным минимальным набором па раметров.
Класс без стандартного конструктора
листинге 9.5 представлен класс Human без стандартного конструктора, что заставляет создавать его объекты, предоставляя имя и возраст.
И СТИ Н Г 9.5 . Класс с перегруженным конструктором, но без стандартного конструктора
#include
#include
using namespace std;
3:
class Human
{
private:
// Закрытые данные-члены:
string Name;
int Age;
1 0 :
public:
1 2 :
// перегруженный конструктор (без стандартного конструктора)
Human(string HumansName, int HumansAge)
{
Name = HumansName;
Age = HumansAge;
cout << "Overloaded constructor creates " « Name;
19: cout « " of age " « Age « endl;
20: }
2 1 :
void IntroduceSelf()
{
cout << "I am " + Name « " and am ";
cout « Age « " years old" « endl;
}
};
28
29 int main()
Конструкторы 217
I-1: // Закомментирована следующая строка, пытающаяся создать объект
с использованием стандартного конструктора
;1:// Human FirstMan;
:4: Human FirstMan("Adam", 30);
Human FirstWoman("Eve", 28);
FirstMan.IntroduceSelf();
FirstWoman.IntroduceSelf();
}
Результат
Overloaded constructor creates Adam of age 30
Overloaded constructor creates Eve of age 28
I am Adam and am 30 years old
I am Eve and am 28 years old
Анализ
Строка 32 в функции m a in () заслуживает внимания. Она очень похожа на код, соз дающий объект F ir s t M a n , в листинге 9.3, но если снять с нее комментарий, компиляция дотерпит неудачу с сообщением e r r o r : 'H u m an ' : no a p p r o p r ia t e d e f a u lt c o n
s t r u c t o r a v a i l a b l e (ошибка: 'H u m an ' : нет подходящего стандартного конструктора).
Дело в том, что у этой версии класса Human есть только один конструктор, получающий входные параметры типа s t r i n g и i n t , как можно заметить в строке 14. Никакого стан дартного конструктора нет, а при наличии перегруженного конструктора компилятор C++ не предоставляет стандартный конструктор автоматически.
Таким образом, этот пример демонстрирует возможность разработки классов, объекты которых можно создать, только предоставив определенные параметры, в данном случае Name и А де . Пример в листинге 9.5 демонстрирует также возможность присвоения зна чения переменной члену Name при создании объекта класса Human и невозможность из менить его впоследствии. Дело в том, что класс Human хранит атрибут имени в закрытой
переменной типа s t r i n g по имени Name, к которой нельзя обратиться или модифициро вать из функции m a in () или любого другого места, кроме как из класса Human. Другими
словами, перегруженный конструктор вынуждает пользователя класса Human определить имя (и возраст) для каждого создаваемого объекта и не позволяет изменять это имя, — весьма неплохая модель реального положения вещей, не так ли? Имя вам родители дали при рождении; людям разрешено знать его, но ни у кого (кроме вас) нет права изменить его.
Do'stlaringiz bilan baham: |