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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться новичку, оператор const в параметрах конструктор  
:(
    Опции темы
Novice21
Дата 23.4.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться.
Имеется объект в котором описывается класс функтор
Код

class foo
{
...
class Instance :
        std::unary_function<ABM_DOUBLE, ABM_BOOL>
    {
    public:
        
        Instance(const foo& rThis)
            {
                m_V = rThis.GetV();
            }
        
        
        ABM_BOOL operator () (ABM_DOUBLE V) const;
        
        ABM_DOUBLE GetV() const 
            { return m_V; }
    private:
        ABM_DOUBLE    m_V;
    };
...
}

Что имеется в виду когда в параметрах конструктора класса функтора пишется оператор const (в коде выделено жирным шрифтом)?
Заранее спасибо 
PM MAIL   Вверх
ShavarRsh
Дата 23.4.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм, ну тоже, что и всегда: передавая объект по ссылке, модификатор const гарантирует, что  функция не изменит передаваемый объект.
Чем конструктор функтора хуже любой другой функции?
PM MAIL   Вверх
baldina
Дата 24.4.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



параметры в функции передаются по значению. это означает, что передается копия переменной, а сама передаваемая переменная остается неизменной.
Код

int inc (int x)
{
   return ++x;
}

....

int y = 10;
int z = inc(y); // z = 11, y все еще 10

это известно. для больших структур данных передача по значению неэффективна, много копировать приходится. однако часто передаваемые параметры не модифицируются, поэтому технически более выгодно передать по ссылке (тип int только в качестве примера):
Код

int inс (int& x)
{
   return x+1;
}

эта функция не модифицирует значение x, хотя и может, например:
Код

int inc (int& x)
{
   return ++x;
}

....

int y = 10;
int z = inc(y); // z = 11, y = 11

если такое поведение нежелательно (в действительности мы хотим передать по значению, а ссылку используем только ради эффективности), объявляют аргумент константой:
Код

int inc (const int& x)
{
   return ++x; // ошибка компиляции: нельзя модифицировать const
}
int inc (const int& x)
{
   return x+1; // ок
}

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

Это сообщение отредактировал(а) baldina - 24.4.2008, 01:02
PM MAIL   Вверх
Fazil6
Дата 24.4.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 7
Всего: 60



Цитата(baldina @  24.4.2008,  01:02 Найти цитируемый пост)
a) предотвратить ошибки, связанные с модификацией аргумента б) пользователю функции дать информацию, что семантически мы передаем по значению и в) возможно, даем компилятору доп. информацию для оптимизации


таком случае const  позволяет неявное преобразование ибо вызвать конструктор с параметром не являющимся l-value и передающимся по ссылке можно только при константной ссылке. т.е. вызвать 
Код

int x = inc(1); // если ссылка не const получим compile error
 
PM MAIL   Вверх
baldina
Дата 24.4.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



верно
PM MAIL   Вверх
Novice21
Дата 24.4.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема на самом деле в том что имея  указатель на объект foo и вызывая функтор компилятор возвращает ошибку:
 не могу преобразовать указатель на foo в const указатель на foo.
И вот тут я ничего не понимаю smile 
PM MAIL   Вверх
baldina
Дата 24.4.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



код покажи
PM MAIL   Вверх
archimed7592
Дата 28.4.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(Novice21 @  24.4.2008,  18:42 Найти цитируемый пост)
Проблема на самом деле в том что имея  указатель на объект foo и вызывая функтор компилятор возвращает ошибку:
 не могу преобразовать указатель на foo в const указатель на foo.
И вот тут я ничего не понимаю 

Код

foo *pFoo = ...;
foo::Instance fooInstance(pFoo);

Так? Если да, то нужно писать так:
Код

foo::Instance fooInstance(*pFoo);
А компилятор в свою очередь не мог преобразовать указатель на foo в константную ссылку на foo, что есть разные сущности.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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