Advertisement
RobertDeMilo

WB3.9 Константность методов

Sep 5th, 2023
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. int ComputeDistance(const string& source, const string& destination)
  6. {
  7.     return source.length() - destination.length();
  8. }
  9.  
  10. class Route
  11. {
  12. public:
  13.     **********************************************************************************************************
  14.     C одной стороны в методе GetSource() нигде не написано, что он не имеет права изменять текущий объект.
  15.     В этом методе можем, например, поменять поле source и ничто этому не помешает.
  16.  
  17.     С другой стороны функция PrintRoute() принимает константную ссылку на маршрут.
  18.     Эта функция не имеет права поменять переданный ей маршрут.
  19.     А метод GetSource(), который вызывается от константной ссылки может поменять этот объект.
  20.  
  21.     Поэтому нужно указать в методе GetSource(), что он не имеет права изменять переданный объект.
  22.     **********************************************************************************************************
  23.     string GetSource() const
  24.     {
  25.         return source;
  26.     }
  27.  
  28.     string GetDestination() const
  29.     {
  30.         return destination;
  31.     }
  32.  
  33.     int GetLength() const
  34.     {
  35.         return length;
  36.     }
  37.  
  38.     // Попробуем объявить константным метод SetSource
  39.      error: passing 'const Route' as 'this' argument discards qualifiers
  40.     // Попытка вызвать из якобы константного метода SetSource неконстантый метод UpdateLength
  41.  
  42.     void SetSource(const string& new_source) /*const */
  43.     {
  44.         source = new_source;
  45.         UpdateLength();
  46.     }
  47.  
  48.     void SetDestination(const string& new_destination)
  49.     {
  50.         destination = new_destination;
  51.         UpdateLength();
  52.     }
  53.  
  54. private:
  55.  
  56.     void UpdateLength()
  57.     {
  58.         length = ComputeDistance(source, destination);
  59.     }
  60.  
  61.     string source;
  62.     string destination;
  63.     int length;
  64. };
  65.  
  66.  
  67. void PrintRoute(const Route& route)
  68. {
  69.     cout << route.GetSource() << " - " <<
  70.         route.GetDestination() << "\n";
  71.  
  72.     // Не нужно по константной ссылке вызывать метод SetSource(), так как он может изменить текущий объект.
  73.     /*route.SetSource("Moscow");*/
  74. }
  75. void ReverseRoute(Route& route)
  76. {
  77.     // По неконстантной ссылке на маршрут можем вызвать как
  78.     //константные методы (GetSource, GetDestination),
  79.     //так и неконстантые методы (SetSource, SetDestination)
  80.  
  81.     string old_source = route.GetSource();
  82.     string old_destination = route.GetDestination();
  83.     route.SetSource(old_destination);
  84.     route.SetDestination(old_source);
  85. }
  86.  
  87. int main()
  88. {
  89.     Route route;
  90.  
  91.     route.SetSource("Moscow");
  92.     route.SetDestination("Vologda");
  93.  
  94.     PrintRoute(route);
  95.  
  96.     ReverseRoute(route);
  97.     PrintRoute(route);
  98.  
  99.     return 0;
  100. }
  101. **************************************************************************************************
  102.  Методы могут быть:
  103.  константными  - не имеют права менять текущий объект  
  104.  неконстантными
  105.  
  106.  Если пишем метод, который текущий объект не меняет, то метод нужно объявить константным  
  107.  
  108.  По константной ссылке на объект можно вызвать только константый метод
  109.  По НЕконстантной ссылке на можно вызвать ЛЮБОЙ метод текущего объекта
Tags: const
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement