Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Ключевое слово const для возвращаемого значения из функции

10.02.2017, 09:51. Показов 11941. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Думал что это означает следующее "Нельзя изменить значение которое вернет функция"
Но проверил и оказалось что это не так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
const int foo()
{
    return 200;
}
 
int main()
{
   int n = foo();//переменная n по идее должна быть инициализирована только с ключевым словом const, но и без него компилируется
   n+=2;
   std::cout << n;
}
Зачем тогда нужен const перед типом возвращаемого значения из функции?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2017, 09:51
Ответы с готовыми решениями:

Ключевое слово const после декларации функции в классе
Здравствуйте, у меня есть подобный класс-шаблон: template &lt;typename Type&gt; class Array { private: Type* ptr; // ...

Ключевое слово const после ключевого слова new
Наткнулся на такую запись const int* ciq = new const int (3); Какую роль играет const после new?

Ключевое слово const в параметрах конструктора копий
вот такая делема возникла))есть билдер 2006 и 2009 в 6-ом конструктор копий определен так Имя(Имя&amp;); и все прекрасно работает как...

20
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
10.02.2017, 09:56
Чтобы нельзя было изменить объект, возвращаемый из функции.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 09:58  [ТС]
Nishen,
Так выше пример изменяет объект который возвращается из функции
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
10.02.2017, 10:01
Нет, не изменяет. Изменяете Вы объект n, который был инициализирован значением, вернувшимся из функции.

Добавлено через 2 минуты
Можете почитать об этом у Майерс Скотта "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ", правило №3.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:01  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
Нет, не изменяет. Изменяете Вы объект n, который был инициализирован значением, вернувшимся из функции.
А как же RVO? Тут же должно быть RVO и в таком случае по сути это один и тот же объект

Может я чего то не понимаю. Можно пример?
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
10.02.2017, 10:12
Цитата Сообщение от sys_beginner Посмотреть сообщение
А как же RVO?
Впервые столкнулся с этим понятием, поэтому ничего не могу сказать об этом.

Добавлено через 7 минут
После беглого чтения про RVO, не совсем понял, при чём оно в Вашем вопросе.
Подождём более опытных форумчанинов и послушаем, что они скажут.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:15  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
При беглом чтении про RVO, не совсем понял, при чём оно в Вашем вопросе.
Насколько я понимаю, в данном случае должен быть создан всего 1 объект, вместо двух (один в функции и второй при присвоении результата переменной n с помощью вызова функции)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.02.2017, 10:16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Зачем тогда нужен const перед типом возвращаемого значения из функции?
Нужен только в тех случаях, когда возвращается ссылка(на статический объект, к примеру), А так он, конечно, бесполезен, ибо объект копируется и там уже const или не-const решается принимающей стороной. )))
1
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
10.02.2017, 10:20
sys_beginner, попробуй вернуть из функции не объект, а ссылку на объект. Тогда разница станет понятной.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:25  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
Нужен только в тех случаях, когда возвращается ссылка(на статический объект, к примеру)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
const int& foo()
{
    static int n = 200;
    return n;
}
 
int main()
{
    int n = foo();
    n+=2;
    std::cout << n;
}
http://rextester.com/ZLW30390
Не очень понятно, можно пример? Вот я вернул ссылку на статический объект и без указания const принял значение в переменную n внутри main.

Добавлено через 25 секунд
Цитата Сообщение от likehood Посмотреть сообщение
попробуй вернуть из функции не объект, а ссылку на объект. Тогда разница станет понятной.
Уже вернул. Но похоже разницы нету
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
10.02.2017, 10:26
Цитата Сообщение от sys_beginner Посмотреть сообщение
Уже вернул. Но похоже разницы нету
C++
1
2
3
4
5
6
7
8
9
10
11
12
int& foo()
{
    static int x = 0;
    return x;
}
 
int main()
{
    int &x = foo();
    x += 10;
    cout << foo() << endl;
}
Если возвращать константную ссылку, работать не будет.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:29  [ТС]
А всё понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
const int& foo()
{
    static int n = 200;
    return n;
}
 
int main()
{
    const int& n = foo();
    std::cout << n;
}
Добавлено через 1 минуту
Цитата Сообщение от likehood Посмотреть сообщение
Если возвращать константную ссылку, работать не будет.
Вот так будет

Добавлено через 1 минуту
Только мне не ясно одно, по идее тут должен был сработать RVO, в результате которого насколько я понимаю должен быть создан всего 1 константный объект (это я про первый пример). Если кто-то поймет где у меня недопонимание прошу сообщить
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
10.02.2017, 10:31
Цитата Сообщение от sys_beginner Посмотреть сообщение
Вот так будет
Я имел в виду, что при возврате константной ссылки нельзя изменить внутреннюю переменную x. То есть n += 10 не сработает.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:33  [ТС]
likehood,
Понятно

Добавлено через 14 секунд
Вопрос про RVO все еще актуален
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.02.2017, 10:41
Цитата Сообщение от sys_beginner Посмотреть сообщение
Не очень понятно, можно пример?
http://rextester.com/IWKW83466
В вашем примере всё то же копирование...

Добавлено через 5 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
Только мне не ясно одно, по идее тут должен был сработать RVO, в результате которого насколько я понимаю должен быть создан всего 1 константный объект (это я про первый пример)
А при чём тут RVO? Тут copy elision.
http://en.cppreference.com/w/c... py_elision
А константность удаляется компилятором за ненадобностью... Хотя, это лишь мои мысли, я не эксперт и ничего утверждать не буду.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
struct A
{
    A() { std::cout << "ctor\n"; }
    ~A() { std::cout << "dtor\n"; }
    A(const A&) { std::cout << "copy ctor\n"; }
    A(A&&) { std::cout << "move ctor\n"; }
    A& operator=(const A&) { std::cout << "operator=\n"; return *this; }
};
 
const A foo()
{
    return A();
}
 
int main()
{
    A a = foo();
}
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:43  [ТС]
GbaLog-,
А почему для такого кода который ниже нельзя сделать foo() +=1 ? А в том случае когда возвращается константная ссылка на статический объект - компилятор считает это валидной операцией но ругается что есть попытка изменить объект предназначенный только для чтения? А в этом случае он вообще говорит что такая запись запрещена
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int foo()
{
    int n = 100;
    return n;
}
 
int main()
{
    foo() += 1;
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.02.2017, 10:47
Цитата Сообщение от sys_beginner Посмотреть сообщение
А почему для такого кода нельзя сделать foo() +=1 ?
Потому что из функции возвращается объект, который кто-то должен принять.
А принять его должны, потому что он временный и исчезнет по выходу из функции, к нему просто так ничего не прибавить, ибо на операции сложения объект уже не существует.

Добавлено через 44 секунды
Цитата Сообщение от sys_beginner Посмотреть сообщение
А в том случае когда возвращается константная ссылка на статический объект - компилятор считает это валидной операцией но ругается что есть попытка изменить объект предназначенный только для чтения?
Потому что статический объект не исчезнет по выходу из функции, но он констаной ссылкой возвращается, поэтому изменять его нельзя.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 10:48  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
ибо на операции сложения объект уже не существует.
Как хитро... Спасибо!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.02.2017, 12:04
Цитата Сообщение от sys_beginner Посмотреть сообщение
Зачем тогда нужен const перед типом возвращаемого значения из функции?
он и не нужен в 99% случаев.

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

например:
банк возвращает объект "карту"
но только для чтения.
никто кроме самого банка не имеет право изменять состояние счета.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
 
struct card
{
    void view()const 
    {std::cout << "денег на счету: " << money << std::endl; }
    
    
    void set_money(const size_t v) { money = v; }
    
    size_t money = 0;
};
 
 
const card bank() 
{
    card c;
    // только банк может устанавливать и менять сумму денег на карточке
    c.set_money(1000); 
    return c;
}
 
 
 
int main() 
{
    std::cout << "helloб world\n";
    
    // пользователи могут только читать
    // но не менять состояние объекта
    bank().view(); 
    
}
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.02.2017, 12:22  [ТС]
hoggy,
Я понял
просто думал если класть в переменную результат выполнения этой функции
то такая переменная обязательно должна быть const иначе компилятор будет ругаться
потому что возвращаемое значение является константой
но как видно такое не происходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.02.2017, 12:22
Помогаю со студенческими работами здесь

Модификатор const в качестве возвращаемого значения
const int get_size(const int&amp; a) { return a; } int main() { const int size = get_size(5);

Ключевое слово static в объявлении функции
Доброго времени суток. У меня возник вопрос по поводу использования слово static в объявлении функции. На сколько мне известно данное...

Ключевое слово class в параметрах функции
Всем привет. Увидел в чужом коде такую конструкцию. void SomeFunction(class SomeClass * a) { a-&gt;F(); } В параметрах...

Тип возвращаемого значения функции
есть класс point. в другом классе есть член функция point GetUpperLeft() { return itsUpperLeft; } эта член-функция исходя из типа...

Функции (вызов и тип возвращаемого значения)
Доброй ночи! Кто может помочь мне по следующей задачей? Есть динамический массив в main(): double *m=new double ; Есть функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru