Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ const и C++

Автор: kibsoft 4.5.2010, 16:46

Вообще const в методах нужен только для запрета изменения данных?:
void func()const;//тут нельзя изменять все, что не mutable
void fucn(const A *obj);//нельзя изменять объект A.
Вот прочитал на хабре:

Цитата
Кроме того, этот const позволяет перегружать методы. Таким образом, вы можете писать оптимизированные варианты методов для константных объектов.

Раскрывающийся текст
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;
}

Результат:

A(int) // x=1
f() // x=1
A(int) // x=2
f() const // x=2

То есть для константного объекта (с x=2) был вызван соответствующий метод.

Оптимизированный в том смысле, что самому заботится не надо какой ты объект передаешь(const, не const) и компилятор сам выберет нужный метод?
А вообще const в аргументах и т.д. хоть как-то влияет на скорость выполнения?
P.S. Пока понимаю только один смысл - оберегание от случайных изменений данных.

Автор: Iron Bug 4.5.2010, 17:23

это обычная перегрузка методов класса. для компилятора константный объект класса и просто объект класса - по сути, разные типы аргументов.
this неявно передаётся в любой метод класса.
к константным объектам могут быть применены только константные методы.
если ты не перегрузишь константный метод - то получишь ошибку компиляции - несоответствие квалификаторов.

компилятор, конечно, пытается оптимизировать работу с константными объектами, но я не думаю, что это даст серьёзный прирост по производительности программы. в примере предполагается оптимизация логики методов для константных объектов со стороны программиста.

Автор: Litkevich Yuriy 4.5.2010, 17:50

Цитата(Iron Bug @ 4.5.2010, 21:23) *
по сути, разные типы аргументов
угу. я тут с ними вошкался намедни.
Если функция помечена как const это ещё не значит что она не изменяет объект. Просто компиллер так будет думать.

Например:
void func(const Object &object)
{
  object.mthod();
}
если метод mthod() помечен как константный, то его можно вызвать в этой функции. Т.к. объект передаётся по константной ссылке. А если метод не помечен как константный, то компиллер будет ругаться. Можно, конечно взять и пометить. Но хорошенько не подумав так лучше не делать. Т.к. компиллер тебе уже будет не помощник (ему не на что будет ругаться в других ситуациях)

Автор: Iron Bug 4.5.2010, 18:02

Цитата(Litkevich Yuriy @ 4.5.2010, 20:50) *
А если метод не помечен как константный, то компиллер будет ругаться.

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

Автор: Tonal 5.5.2010, 8:07

Про оптимизацию недавно обсуждали 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)