Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Class method() const; const Class& method() const; поясните разницу 
V
    Опции темы
kemiisto
  Дата 30.3.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Пример:
Код

class Sphere3D: public Quadric3D
{
public:
  Sphere3D(const Point3D& centre, GLfloat radius, const Material3D& material);
  Point3D centre() const;             // первый вариант
  const Point3D& centre() const; // второй вариант
  GLfloat radius() const;
  void draw(Style style, Quality quality);
private:
  Point3D centre_;
  GLfloat radius_;
};


Вообщем нужен инспектор, а не мутатор. А вот как его объявить? 1 или 2? Тело этого метода тривиально:
Код

  return centre_;


Используется, например, в методах класса Point3D:
Код

bool Point3D::isInside(const Sphere3D& sphere) const
{
  if (sqrt(pow((x_ - sphere.centre().x_), 2) +
           pow((y_ - sphere.centre().y_), 2) +
           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius())
    return true;
  else
    return false;
}


Работает и так и так. А есть ли разница?

P.S. Сильно не пинать. Я только начинаю... smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
mes
Дата 30.3.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



2й вариант предпочтительнее, потому что не будет создавать дополнительных копий,
например при передачи в такую функцию void fn (const Point3D& )


Это сообщение отредактировал(а) mes - 30.3.2009, 14:50


--------------------
PM MAIL WWW   Вверх
kemiisto
Дата 30.3.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(mes @  30.3.2009,  12:47 Найти цитируемый пост)
2й вариант предпочтительнее, потому что не будет создавать дополнительных копий,

mes, спасибо! 

А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Acer
Дата 30.3.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



const нужен для того, чтобы сказать компилятору, что твой метод не будет менять свойства экземпляра класса.
PM MAIL   Вверх
mes
Дата 30.3.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kemiisto @  30.3.2009,  14:05 Найти цитируемый пост)
А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода? 

не только.. Тогда когда нужно отдать именно копию, а не ссылку на объект. Это нужно почувствовать, объяснить сложно smile

Добавлено через 57 секунд
Цитата(Acer @  30.3.2009,  14:09 Найти цитируемый пост)
const нужен для того, чтобы сказать компилятору, что твой метод не будет менять свойства экземпляра класса. 


Acer,  kemiisto не про этот const спрашивает smile



--------------------
PM MAIL WWW   Вверх
Acer
Дата 30.3.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Цитата(kemiisto @ 30.3.2009,  14:05)
А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода?

Такая конструкция вернет тебе копию обьекта Class
PM MAIL   Вверх
kemiisto
Дата 30.3.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(mes @  30.3.2009,  13:12 Найти цитируемый пост)
Тогда когда нужно отдать именно копию, а не ссылку на объект. Это нужно почувствовать, объяснить сложно

Да... Чуточку прояснилось...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
vinter
Дата 30.3.2009, 15:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(kemiisto @  30.3.2009,  14:54 Найти цитируемый пост)
bool Point3D::isInside(const Sphere3D& sphere) const{  if (sqrt(pow((x_ - sphere.centre().x_), 2) +           pow((y_ - sphere.centre().y_), 2) +           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius())    return true;  else    return false;}

это что за индокод? smile
Код

bool Point3D::isInside(const Sphere3D& sphere) const
{
      return sqrt(pow((x_ - sphere.centre().x_), 2) +
           pow((y_ - sphere.centre().y_), 2) +
           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius(); 
}



--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 30.3.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата

Это нужно почувствовать, объяснить сложно

Действительно бывают случаи, 
Цитата

когда нужно отдать именно копию, а не ссылку на объект

- когда объект временный (то, что упомянул kemiisto)
- когда думаешь про семантику, а не оптимизацию
- когда нужно отдать не константный объект, например имеющий нестандартную семантику присваивания

а вот представим ситуацию, когда значение Point используется в цикле:
Код

//вариант 1

Sphere s;
Point p = s.centre ();
for (...)
{
  // do something with point
}

Код

//вариант 2
Sphere s;
for (...)
{
  // do something with s.centre ();

}

есть разница? а теперь представим, что s. centre_ может измениться. в этом случае один из вариантов будет работать неправильно. какой именно - зависит от задачи
PM MAIL   Вверх
kemiisto
  Дата 30.3.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(vinter @  30.3.2009,  13:38 Найти цитируемый пост)
это что за индокод?

 smile бывает...

baldina, я даже что то понял, из того, что Вы сказали. smile Да, пойду дальше копаться...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
mes
Дата 30.3.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(vinter @  30.3.2009,  14:38 Найти цитируемый пост)
это что за индокод? smile

не слишком ли грубо за лишнeе использование "if" ?


--------------------
PM MAIL WWW   Вверх
vinter
Дата 31.3.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mes @  31.3.2009,  00:51 Найти цитируемый пост)
не слишком ли грубо за лишнeе использование "if" ?

нет
Код

bool f()
{
     if(a==b)
          return true;
      else
          return false;
}

это как раз пример индокода, одного из ярчайших его проявлений

Это сообщение отредактировал(а) vinter - 31.3.2009, 07:50


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 31.3.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



 smile 
а меня, признаться, больше задел сам метод bool Point3D::isInside(const Sphere3D& sphere) const

получается, что класс Point3D должен знать обо всех типах, внутри которых может находиться точка.
логичнее bool isInside(const Point3D&, const Sphere3D& sphere) (эх, мультиметоды сюда бы)

да и реализация... pow... sqrt... гм... навела на размышления ;-)
почему не
Код

template <typename T>
inline 
T sqr (const T& x) 

   return x*x; 
}

bool isInside(const Point3D& point, const Sphere3D& sphere)
{
   return sqr(point.x_ - sphere.centre().x_) +
              sqr(point.y_ - sphere.centre().y_) +
              sqr(point.z_ - sphere.centre().z_) <= sqr (sphere.radius ());
}


PM MAIL   Вверх
kemiisto
  Дата 31.3.2009, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Ещё раз спасибо всем за помощь. 

Но я попрошу воздержаться от комментариев не по теме. 
Во-первых, это только наброски. 
Во-вторых, 
Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
логичнее
 это субъективная оценка. 
В-третьих, я не просил оценивать объектную модель.

Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
получается, что класс Point3D должен знать обо всех типах, внутри которых может находиться точка.

baldina, есть ведь ещё базовый класс Primitive3D... Это же только набросок. Какой смысл обсуждать объектную иерархию без полноты картины. Я эту картину ещё и сам то не видел, а Вы...

Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
почему не

А есть какая то принципиальная разница? smile 

Это сообщение отредактировал(а) kemiisto - 31.3.2009, 10:14


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Lazin
Дата 31.3.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(kemiisto @  31.3.2009,  10:14 Найти цитируемый пост)
это субъективная оценка. 
В-третьих, я не просил оценивать объектную модель.

очень даже объективная и правильная оценка smile 
точка не должна знать о всех фигурах в которые она может попадать или нет, это объекты геом. фигур должны уметь определять, принадлежит им точка или нет, либо можно сделать это функцией smile 
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1228 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.