не понимаю я эту константность в с++

Тема в разделе "LANGS.C", создана пользователем systemio, 26 апр 2008.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    VS2003

    Код (Text):
    1. struct sS1
    2. {
    3.  void f(int*) { }
    4.  void f1( int&) { }
    5. };
    6.  
    7. struct sS
    8. {
    9.  int i;
    10.  int* pi;
    11.  
    12.   void f(void)
    13.   {
    14.     sS1 s1;
    15.  
    16.     s1.f(pi);
    17.     s1.f(&i);
    18.     s1.f1(*pi);
    19.     s1.f1(i);
    20.   }
    21.   void f1(void) const
    22.   {
    23.     sS1 s1;
    24.  
    25.     s1.f(pi); // почему нет ошибки!?
    26.     s1.f(&i); // ошибка !
    27.  
    28.     s1.f1(*pi); // почему нет ошибки!?
    29.     s1.f1(i); // ошибка !
    30.   }
    31. };
    По какому принципу работают константные методы!?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    в первом случае вызываемая функция не может изменить значение pi, она может изменить значение переменной, на которую указывает pi.
    во втором случае передается адрес переменной i, по этому адресу можно изменить значение i

    аналогично
    в первом случае мы подставляем адрес переменной, которая не используется на прямую. ее значение можно менять
    во втором случае мы подставляем адрес переменной, которая может использоваться напрямую, а так как конст, то ошибка

    короче если const, то нельзя менять только значения используемых переменных, а те значения на которые эти переменные указывают, и на которые указывают указатели, на которые указывают эти переменные, и т.д. менять можно
     
  3. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    вроде вкурил - спасибо!
     
  4. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    вот такой пример: BCB

    Код (Text):
    1. struct S
    2. {
    3.  void Get() const { }
    4.  void Set() { }
    5. };
    6.  
    7. class C
    8. {
    9. public:
    10.  list<S> ls;
    11.  
    12.  void f() const
    13.  {
    14.    for_each(ls.begin(), ls.end(), mem_fun_ref(&S::Set));  
    15. // почему опять нет ошибки ведь бегин возвращает константный итератор на константный объект при разыменовании
    16.    Application->MessageBoxA(typeid(*ls.begin()).name(), "");
    17.  }
    18.  void f1()
    19.  {
    20.    for_each(ls.begin(), ls.end(), mem_fun_ref(&S::Set));
    21.    Application->MessageBoxA(typeid(*ls.begin()).name(), "");
    22.  }
    23. };
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    systemio
    Оформляй код соответствующим образом! Больше подтирать за тобой никто не будет.
     
  6. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    в функции f, этот код не должен компилирироваться.
     
  7. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Однако компилируется и запускается - да к тому же и без ворнингов.
     
  8. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    какой компилер?