Russian Qt Forum
Мая 17, 2025, 12:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Для чего нужно возвращать константное значение в методах?  (Прочитано 10876 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
billygates
Гость
« : Мая 09, 2011, 07:15 »

Привет,

Когда может потребовать такое:
Код
C
const std::string myMethod();
вместо
Код
C
std::string myMethod();
? Ведь все равно возврат происходит по значению. Если бы по ссылке -- то было бы понятно.

Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Мая 09, 2011, 08:58 »

Потребоваться может в тех же случаях что и со ссылкой, напр
Код
C++ (Qt)
const sring appPath = GetAppPath();
 
Не хотим чтобы appPath затем менялось - это ошибка. Но возвращать его по ссылке неудобно - если такой переменной нет. Пришлось бы городить как-то так
Код
C++ (Qt)
const string & GetAppPath( void )
{
static string thePath;
thePath = argv[0];
 ...
return thePath;
}
 


Записан
Sancho_s_rancho
Гость
« Ответ #2 : Мая 09, 2011, 11:02 »

2 Igors
Что-то я вашего примера не понял. Может ,конечно, праздники так действуют.
Вы инициализируете константу. Все равно, что справа возвращается const или не const объект.  От этого вашему appPath не холодно, не  жарко.

Разница есть в таком случае:
Код:
struct foo
{
void bar() {}
void barfoo() const {}
};

foo foobar1() {return foo();}
const foo foobar2() {return foo();}

int main()
{
foobar1().barfoo();
foobar1().bar();
foobar2().barfoo();
foobar2().bar();
}
В последнем варианте ( foobar2().bar(); ) у вас  будет ошибка.
Записан
billygates
Гость
« Ответ #3 : Мая 09, 2011, 11:13 »

2 Igors
Что-то я вашего примера не понял. Может ,конечно, праздники так действуют.
Аналогично. Вполне себе можно менять, как я только что проверил на примере
Код
C
#include <iostream>
#include <string>
 
class Foo
{
public:
 Foo()
  : bar_("somebar") {}
 
  const std::string bar() const { return bar_; }
 
private:
 const std::string bar_;
};
 
int main(int argc, char** argv)
{
   Foo foo;
   std::string bar = foo.bar();
   bar.append(".some.preffix");
 
   return 0;
}
 

Разница есть в таком случае:
Спасибо за пример, стало немного понятно. Однако пока это не отменяет для меня синтетичности такой возможности. Может, пожалуйста, кто-то нибудь привести пример из жизни (STL, Qt), когда такое действительно применяется и без этого не обойтись?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Мая 09, 2011, 12:12 »

2 Igors
Что-то я вашего примера не понял. Может ,конечно, праздники так действуют.
Вы инициализируете константу. Все равно, что справа возвращается const или не const объект.  От этого вашему appPath не холодно, не  жарко.
Пример когда станет холодно
Код
C++ (Qt)
const string & Test( void )
{
 return string("abc");  // gcc пропустит (хотя и вякнет варнингом)
}
 
...
const string * test = &Test();  // и это пройдет
int array[100];  // содержимое (на что указывает test) перетерто
 
Записан
Sancho_s_rancho
Гость
« Ответ #5 : Мая 09, 2011, 12:40 »

Только причем тут  возвращение константного объекта, о котором спрашивал billygates?
В последнем примере возвращается ссылка на временный объект. Возвратить можно ссылку или указатель (это одно и тоже) с const или без него. В любом случае код приведет к беде, т.к. объект уничтожен.
Записан
brankovic
Гость
« Ответ #6 : Мая 09, 2011, 13:14 »

Разница есть в таком случае:
...
В последнем варианте ( foobar2().bar(); ) у вас  будет ошибка.

пример правильный, но в реальности такую конструкцию невозможно использовать по делу (не видел нормального применения ни разу). Когда в коде вижу

Код
C
const std::string get_name () const;
const long get_size () const;
...
 

то так оцениваю варианты:

1. с вероятностью .9 автор идиот
2. с вероятностью .09 автор недавно изучил слово const и ставит его везде, где можно
3. с вероятностью .009 в проекте идиотский coding standart
4. в случае сложных типов всегда остаётся шанс, что это и правда нужно.. лучше внимательно изучить этот кусок кода

в общем лучше так не делать никогда, чтобы читающему не пришлось ломать голову над вашими экзерцисами
Записан