crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> const и C++
kibsoft
  опции профиля:
сообщение 4.5.2010, 16:46
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Вообще 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
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1587
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


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

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

Сообщение отредактировал Iron Bug - 4.5.2010, 17:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2010, 17:50
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

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


Профессионал
*****

Группа: Модератор
Сообщений: 1587
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


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

ну, совершенно справедливо ругаться будет. ибо для константного объекта можно вызывать только константные методы, соответственно. на то и сделан квалификатор const. иначе не будет выполняться условие константности.
умозрительно, можно рассматривать квалификатор const как другой тип.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 5.5.2010, 8:07
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Про оптимизацию недавно обсуждали здесь.

А по сути я с Iron Bug согласен - указание const-ов усиливает типизацию. Соответственно компилятор может помочь избежать ошибок в большем числе случаев. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.9.2019, 23:39