VS2003 Код (Text): struct sS1 { void f(int*) { } void f1( int&) { } }; struct sS { int i; int* pi; void f(void) { sS1 s1; s1.f(pi); s1.f(&i); s1.f1(*pi); s1.f1(i); } void f1(void) const { sS1 s1; s1.f(pi); // почему нет ошибки!? s1.f(&i); // ошибка ! s1.f1(*pi); // почему нет ошибки!? s1.f1(i); // ошибка ! } }; По какому принципу работают константные методы!?
в первом случае вызываемая функция не может изменить значение pi, она может изменить значение переменной, на которую указывает pi. во втором случае передается адрес переменной i, по этому адресу можно изменить значение i аналогично в первом случае мы подставляем адрес переменной, которая не используется на прямую. ее значение можно менять во втором случае мы подставляем адрес переменной, которая может использоваться напрямую, а так как конст, то ошибка короче если const, то нельзя менять только значения используемых переменных, а те значения на которые эти переменные указывают, и на которые указывают указатели, на которые указывают эти переменные, и т.д. менять можно
вот такой пример: BCB Код (Text): struct S { void Get() const { } void Set() { } }; class C { public: list<S> ls; void f() const { for_each(ls.begin(), ls.end(), mem_fun_ref(&S::Set)); // почему опять нет ошибки ведь бегин возвращает константный итератор на константный объект при разыменовании Application->MessageBoxA(typeid(*ls.begin()).name(), ""); } void f1() { for_each(ls.begin(), ls.end(), mem_fun_ref(&S::Set)); Application->MessageBoxA(typeid(*ls.begin()).name(), ""); } };