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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в чем отличие? (синтаксис), const int f(); от int f() const; 
:(
    Опции темы
np9mi7
  Дата 14.3.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Добрый день.

Тут недавно задался вопросом:

В чем отличие таких объявлений функций smile
Код

const int f();

от
Код

int f() const;



--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Vyacheslav
Дата 14.3.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 14.3.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



спасибо smile


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Ni@m
Дата 14.3.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Еще немного о втором - если это метод класса, и обьект класса инициализирован константным, то этод метод можно будет вызвать, а если он определен не как константный, то не получится smile
--------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше.
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 14.3.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



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

получается для определения интерфейса, лучше использовать 1 - ый вариант....

Это сообщение отредактировал(а) arajan - 14.3.2005, 17:39


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Ni@m
Дата 14.3.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет, первое просто возвращает константу. Вторая же обещает нам, что ничего в обьекте не изменится!
--------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше.
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 14.3.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(arajan @ 14.3.2005, 17:39)
получается для определения интерфейса, лучше использовать 1 - ый вариант....

Что за чепуха. Причем тут лучше. Это два объявления, означающих совершенно несвязанные вещи

Код

class Test 
{
  public:
  Test():buf(NULL){}
  const char* CreateBuffer();
  const char* Buffer() const; 
  
  private:
  char* buf;
 

}

const char* Test::CreateBuffer()
{
    if (!buf)
    {
        buf = new char[100];
    }
    return buf;
}

const char* Test::Buffer() const
{
    if (!buf) 
    {
        //здесь компилятор выдаст ошибку
        //так как операция  по модификации состояния объекта запрещена в const-методе
        buf = new char[100];  
    }
    return buf;

// Но возврат const  не гарантирует что данные нельзя поменять 
// 
    Test c;
    const char* b = c.CreateBuffer();
    //Так конечно не получится
    b[0] ='A';
    b[1] =0;

    // а вот так без  проблем
    char* b1 = const_cast<char*>(c.CreateBuffer());
 
    b1[0] ='A';
    b1[1] =0;


}







--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 14.3.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Значит эти вещи ваще не связаны.... ок. ну чепуха чепуха, с кем не бывает.... без идиотов не было бы УМНЫХ.

а по поводу интерфейса, без __property не обойтись.... наверное....


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Дрон
Дата 14.3.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(arajan @ 14.3.2005, 18:22)
а по поводу интерфейса, без __property не обойтись.... наверное....

Словечко __property это из C++ Builder и к const'ам не имеет отношения вообще smile
А что ты называешь интерфейсом? smile


--------------------
Да. Именно так.
PM   Вверх
Fantasist
Дата 14.3.2005, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



C константностью, кстати, вещь такая - надо либо ее использовать с последовательной фанатичностью (что предпочтительнее), либо не использовать вообще. Иначе будут возникать проблемы из-за несовместимости константных и неконстаных членов.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
np9mi7
Дата 15.3.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Цитата

А что ты называешь интерфейсом? smile


набор public методов для работы с объектом, и тут совершенно не хочеться чтоб клиет хоть как мог менять содержимое объекта. только наборами специальных методов....

Опять, если хочеться посмотреть своиство объекта, то можно опрелелить интерфейсный метод get* ();... но если он может позволить что то менять в нутри объекта, на мой взгляд это плохо.... (как в случае ситуации которую описал Vyacheslav )....

Цитата
Словечко __property это из C++ Builder и к const'ам не имеет отношения вообще smile

Я это понимаю. Но эта возможность предоставленная компиляторов bcb для организации интерфейсов, очень даже не плохая...

Это сообщение отредактировал(а) arajan - 15.3.2005, 11:39


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Дрон
Дата 15.3.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



arajan
То что ты называешь интерфейсом, обычно называется свойствами (по английски properties)

Цитата(arajan @ 15.3.2005, 11:37)
Опять, если хочеться посмотреть своиство объекта, то можно опрелелить интерфейсный метод get* ();... но если он может позволить что то менять в нутри объекта, на мой взгляд это плохо....

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

На мой взгляд делать метод чтения константным совсем не обязательно. Например у меня часто используется что-то вроде:
Код

TMyClass getValue()
{
    if(m_value == NULL)
         m_value = new TMyClass();
    return m_value;
}

Который естественно меняет состояние объекта, инициализируя поле m_value.

Что же касается константных методов, то можешь ими пользоваться без проблем:

Код

class TMyClass: public TObject
{
   double Fvalue;

   void Test();
   double __fastcall getValue() const;
   void __fastcall setValue(double val);
public:
  __property double       Value = { read = getValue, write = setValue };
};

void TMyClass::Test()  // просто какой-то НЕ константый метод
{
    return;
}

double __fastcall TMyClass::getValue() const // мы гарантируем, что не будем менять состояние
{
// Fvalue = 123.4;  -- этот фокус не пройдёт :)
// Test(); -- и это тоже запрещено, т.к. Test это не const-метод
    return Fvalue;
}

void __fastcall TMyClass::setValue(double val)
{
   if(val > 0) // для разнообразия :)
      Fvalue = val;
   else
      val = 0;
}

Добавлено @ 15:47
Но в то же время, если ты используешь __property (и уверен, что находишься в здравом уме smile ), то тебе этот const и не нужен:
Код

class TMyClass: public TObject
{
   double Fvalue;

public:
  __property double       Value = { read = FValue };
};


Теперь, ты не можешь извне менять значение Value, но можешь его читать, т.е:
Код

TMyClass *test = new TMyClass();
double zzz = test->Value; // всё нормально
test->Value = 123.4; // а вот так уже нельзя, так как write не определён


Это сообщение отредактировал(а) Дрон - 15.3.2005, 15:47


--------------------
Да. Именно так.
PM   Вверх
np9mi7
Дата 15.3.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Дрон
Цитата
То что ты называешь интерфейсом, обычно называется свойствами (по английски properties)

Цитата
набор public методов для работы с объектом
smile ....

МЕТОДОВ!!!!!!!!!!! Ты видел?

и вообще, где ты видел что я отождествлял __property и const.... помоему это бред.... smile


Ладно, все пост себя давно изжил... Про __property не стоило столько писать, тк у всех владельцев bcb есть справка.... там полубому лучше написано, производитель все таки...

Всем спасибо за ответы!


Это сообщение отредактировал(а) arajan - 15.3.2005, 17:42


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Дрон
Дата 15.3.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



arajan
Ок, умолкаю smile
Просто язык твой сложно понимать мне.


--------------------
Да. Именно так.
PM   Вверх
np9mi7
Дата 15.3.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Дрон, да без обид... не ну реально можно справку читать, че ты в самом деле....
А с языком это правда проблема, мне многие говорят, но я пытаюсь с этим бороться....


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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