C++ за 21 день седьмое издание



Download 1,38 Mb.
bet154/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   150   151   152   153   154   155   156   157   ...   437
Bog'liq
word1

#include




  1. using namespace std;



2 :



  1. class Human




  1. {




  1. private:




  1. // Закрытые данные-члены:




  1. int Age;

  2. :




    1. public:




    1. void SetAge(int InputAge)



11: {

  1. Age = InputAge;




  1. }



14:



  1. // Человек лжет о своем возрасте (если ему за 30)




  1. int GetAgeO




  1. {




  1. if (Age > 30)




  1. return (Age - 2);




  1. else




  1. return Age;

22: }

  1. };








  1. int main()




  1. {




  1. Human FirstMan;




  1. FirstMan.SetAge(35);








  1. Human FirstWoman;




  1. FirstWoman.SetAge(22);








  1. cout « "Age of FirstMan " « FirstMan.GetAge() « endl;




  1. cout « "Age of FirstWoman " « FirstWoman.GetAge() « endl;








  1. return 0;




  1. }



Результат



Age of FirstMan 33


Age of FirstWoman 22

Конструкторы

211



Анализ

Обратите внимание на открытый метод 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(); // объявление конструктора
};



  1. определение конструктора (реализация) Human::Human()

{


    1. код конструктора здесь




}


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. Использование конструктора для инициализации переменных-членов класса



  1. #include




  1. #include




  1. using namespace std;








  1. class Human




  1. {




  1. private:




  1. // Закрытые данные-члены:




  1. string Name;




  1. int Age;

1 0 :

  1. public:




  1. // конструктор




  1. Human ()



14:



  1. Age =0; // инициализация гарантирует отсутствие




    1. случайного значения




  1. cout « "Constructed an instance of class Human" « endl;












  1. void SetName (string HumansName)





  1. Name = HumansName;





23



  1. void SetAge(int HumansAge)








  1. Age = HumansAge;












  1. void IntroduceSelf()

Конструкторы 213

{


1:

cout

«

"I am

" + Name

« " and am ";

2:

cout

«

Age «

" years

old" « endl;


  1. }

  2. };




  1. int main()

{


  1. Human FirstMan;




  1. FirstMan.SetName("Adam");




  1. FirstMan.SetAge(30);




  1. Human FirstWoman;




  1. FirstWoman.SetName("Eve");




  1. FirstWoman.SetAge (28);




  1. 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


Анализ



    1. выводе вы видите добавление двух весьма уместных первых строк по сравнению




  1. листингом 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 с предоставленным именем.





  1. И С Т И Н Г 9 .4 , Класс Human с несколькими конструкторами___________________________________





    1. Download 1,38 Mb.

      Do'stlaringiz bilan baham:
1   ...   150   151   152   153   154   155   156   157   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish