Advertisement
RobertDeMilo

YB5.2 Доступ к полям классов. Знакомство со списками инициализации

Nov 22nd, 2023
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. // Поле нельзя будет изменить на протяжении жизни объекта
  2. // Поле нужно будет проинициализировать при создании объекта
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. struct Fruit
  9. {
  10.     int health = 0;
  11.     string type = "fruit";
  12. };
  13.  
  14. struct Apple : public Fruit
  15. {
  16.     Apple()
  17.     {
  18.         health = 10;
  19.         type = "apple";
  20.     }
  21. };
  22.  
  23. //class Animal
  24. //{
  25. //public:
  26. //  void Eat(const Fruit& f)
  27. //  {
  28. //      cout << type << " eats " << f.type << ". " << f.health << "hp." << endl;
  29. //  }
  30. //  protected: //1 способ
  31. //  // могут обращаться только наследники данного класса
  32. //  string type = "animal";
  33. //};
  34.  
  35. class Animal
  36. {
  37. public:
  38.     Animal(const string& t = "animal"): type(t)
  39.     {
  40.         /*type = t;*/
  41.     }
  42.     void Eat(const Fruit& f)
  43.     {
  44.         cout << type << " eats " << f.type << ". " << f.health << "hp." << endl;
  45.     }
  46.     // 2 способ, который позволит избежать непреднамеренной модификации какого-то поля в класее является объявление
  47.     // его константным внутри базового класса
  48.     const string type;
  49. };
  50.  
  51. class Cat : public Animal
  52. {
  53. public:
  54.  
  55.     Cat(): Animal("cat") // Из класса - наследника нужно передать свой собственный тип
  56.     {
  57.         //type = "cat"; пытаемся записать новое значение в константуню переменную
  58.  
  59.         //В С++ все объекты всегда имеют 2 стадии: ИНИЦИАЛИЗАЦИЯ - объект в данный момент создается
  60.         // (он появляется в памяти, его поля инициализируются, но он еще до конца не создан)
  61.         //
  62.         // вторая стадия - это когда уже объект создан (под него выделена память все проинициализировано) и мы с ним работаем
  63.  
  64.         //До вызова конструктора уже произошла инициализация переменной
  65.         //Список инициализации
  66.         //В тот момент когда мы входим в конструкторе в фигурные скобки на самом деле переменные внутри класса они уже проинициализированы
  67.         //и каждый раз когда мы в них{} что-то записываем мы не инициализируем их, а делаем присваивание нового значения, которое записано поверх старого
  68.         //До того как мы вошли в {} переменная уже инициализирована
  69.  
  70.     }
  71.  
  72.     void Meow() const
  73.     {
  74.         cout << "meow! " << endl;
  75.     }
  76. };
  77.  
  78. //void DoMeal(const Animal& a, const Fruit& f)
  79. //{
  80. //  a.Eat(f);
  81. //  a.type += "*";
  82. //}
  83.  
  84. void DoMeal(Animal& a, Fruit& f)
  85. {
  86.     a.Eat(f);
  87.     //a.type += "*";
  88. }
  89.  
  90. int main()
  91. {
  92.     Cat c;
  93.     Apple a;
  94.  
  95.     DoMeal(c, a);  
  96.     DoMeal(c, a);
  97.    
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement