crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в const и C++
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 5.5.2010, 8:07
  Про оптимизацию недавно обсуждали здесь.

А по сути я с Iron Bug согласен - указание const-ов усиливает типизацию. Соответственно компилятор может помочь избежать ошибок в большем числе случаев. :)
Iron Bug Дата 4.5.2010, 18:02
 
Цитата(Litkevich Yuriy @ 4.5.2010, 20:50) *
А если метод не помечен как константный, то компиллер будет ругаться.

ну, совершенно справедливо ругаться будет. ибо для константного объекта можно вызывать только константные методы, соответственно. на то и сделан квалификатор const. иначе не будет выполняться условие константности.
умозрительно, можно рассматривать квалификатор const как другой тип.
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, 17:23
  это обычная перегрузка методов класса. для компилятора константный объект класса и просто объект класса - по сути, разные типы аргументов.
this неявно передаётся в любой метод класса.
к константным объектам могут быть применены только константные методы.
если ты не перегрузишь константный метод - то получишь ошибку компиляции - несоответствие квалификаторов.

компилятор, конечно, пытается оптимизировать работу с константными объектами, но я не думаю, что это даст серьёзный прирост по производительности программы. в примере предполагается оптимизация логики методов для константных объектов со стороны программиста.
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. Пока понимаю только один смысл - оберегание от случайных изменений данных.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 12:24