Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: const и C++
Форум на CrossPlatform.RU > Разработка > С\С++
kibsoft
Вообще 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
это обычная перегрузка методов класса. для компилятора константный объект класса и просто объект класса - по сути, разные типы аргументов.
this неявно передаётся в любой метод класса.
к константным объектам могут быть применены только константные методы.
если ты не перегрузишь константный метод - то получишь ошибку компиляции - несоответствие квалификаторов.

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

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

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

А по сути я с Iron Bug согласен - указание const-ов усиливает типизацию. Соответственно компилятор может помочь избежать ошибок в большем числе случаев. :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.