Вообще const в методах нужен только для запрета изменения данных?:
void func()const;//тут нельзя изменять все, что не mutable
void fucn(const A *obj);//нельзя изменять объект A.
Вот прочитал на хабре:
class A {
private:
int x;
public:
A(int a) {
x = a;
cout << "A(int) // x=" << x << endl;
}
void f() {
cout << "f() // x=" << x << endl;
}
void f() const {
cout << "f() const // x=" << x << endl;
}
};
int main() {
A a1(1);
a1.f();
A const a2(2);
a2.f();
return 0;
}
это обычная перегрузка методов класса. для компилятора константный объект класса и просто объект класса - по сути, разные типы аргументов.
this неявно передаётся в любой метод класса.
к константным объектам могут быть применены только константные методы.
если ты не перегрузишь константный метод - то получишь ошибку компиляции - несоответствие квалификаторов.
компилятор, конечно, пытается оптимизировать работу с константными объектами, но я не думаю, что это даст серьёзный прирост по производительности программы. в примере предполагается оптимизация логики методов для константных объектов со стороны программиста.
void func(const Object &object)
{
object.mthod();
}
если метод mthod() помечен как константный, то его можно вызвать в этой функции. Т.к. объект передаётся по константной ссылке. А если метод не помечен как константный, то компиллер будет ругаться. Можно, конечно взять и пометить. Но хорошенько не подумав так лучше не делать. Т.к. компиллер тебе уже будет не помощник (ему не на что будет ругаться в других ситуациях)
Про оптимизацию недавно обсуждали http://www.prog.org.ru/topic_12851_0.html.
А по сути я с Iron Bug согласен - указание const-ов усиливает типизацию. Соответственно компилятор может помочь избежать ошибок в большем числе случаев.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)