Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Knjagskij
-4 / 6 / 2
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
#1

Функция, возвращающая константу - C++

26.04.2016, 10:02. Просмотров 606. Ответов 14
Метки нет (Все метки)

Почему добавление спецификатора const ничего не меняет?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int f(int a)
{
    return a;
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyClass cl;
 
    int c = f(3);
    c++;
    cout << c;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2016, 10:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция, возвращающая константу (C++):

Функция, возвращающая константу #define
привет. У меня есть #define константы, которые ссылаются на вложенные в ресурсы...

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

Функция, возвращающая указатель
Здравствуйте. Пускай есть класс Some_type и массив такого класса. Можно ли...

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

Функция возвращающая ссылку
Так делать не правильно, но попытался написать код: int&amp; func(int &amp;x) { ...

Функция возвращающая массив
Здравствуйте. Для возврата массива возвращаю указатель на него, но вне предела...

14
SpBerkut
Объявлятель переменных
948 / 274 / 275
Регистрация: 24.09.2011
Сообщений: 1,008
Завершенные тесты: 2
26.04.2016, 10:16 #2
Конструкция int c = f(3); эквивалентна int c = 3;. Т.е. Вы присваиваете значение константы переменной.
0
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
26.04.2016, 10:20 #3
Потому что это равносильно
C++
1
2
3
4
5
6
7
8
9
int main(int argc, char *argv[])
{
    const int f=3;
    //int c = f(3);
    int c = f;
    c++;
    cout << c << endl;
 
}
f то не меняется
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
26.04.2016, 11:20 #4
Цитата Сообщение от Knjagskij Посмотреть сообщение
const int f(int a)
функция со спецификатором const не возвращает константу, спецификатор const лишь означает, что функция не меняет свои аргументы.
0
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
26.04.2016, 11:25 #5
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
функция со спецификатором const не возвращает константу, спецификатор const лишь означает, что функция не меняет свои аргументы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
const int f(int a)
{
    a++;
    return a;
}
 
int main(int argc, char *argv[])
{
    int c = f(3);
    c++;
    cout << c;
 
}
Почему же, вот меняет спокойно
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
26.04.2016, 11:28 #6
Stitch Igorek, что?)

Вы возвращаете константный int - но так как у int нету методов вы не можете прочувствовать всю силу этого.
Далее любое присвоение или инициализация int'а которого вернули будет происходить копирование - всё.

Добавлено через 1 минуту
Цитата Сообщение от akaAxeL Посмотреть сообщение
Почему же, вот меняет спокойно
Вы не правы - аргумент не поменялся))) Так как у вас в коде литерал на число 3, и вы говорите что вы изменили литерал - вас ничего не смущает?)
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
26.04.2016, 11:34 #7
Цитата Сообщение от akaAxeL Посмотреть сообщение
Почему же, вот меняет спокойно
Меняет, я сам сейчас сижу удивляюсь(правда в твоем случае не меняет - 3 в мэйне так и остается тройкой)
и назрел другой вопрос если передавать параметр по ссылке.
C++
1
2
3
4
const int f(int &a)
{
    return a;
}
если эту функцию из мейна вызвать так
C++
1
2
int b = 3;
    int c = f(b);
то все работает, а если так
C++
1
    int c = f(3);
то ошибка.

Добавлено через 2 минуты
хотя если добавить const
C++
1
const int f(const int &a)
работает и эта запись
C++
1
int c = f(3);
0
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
26.04.2016, 11:36 #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Stitch Igorek, что?)

Вы возвращаете константный int - но так как у int нету методов вы не можете прочувствовать всю силу этого.
Далее любое присвоение или инициализация int'а которого вернули будет происходить копирование - всё.

Добавлено через 1 минуту

Вы не правы - аргумент не поменялся))) Так как у вас в коде литерал на число 3, и вы говорите что вы изменили литерал - вас ничего не смущает?)
А приведите пожалуйста пример, когда аргумент поменяется
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
26.04.2016, 11:41 #9
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
#include <iostream>
using namespace std;
 
void show(const int x){ cout << x << endl;}
 
void f( int& obj )
{
   obj++; 
   // так как это ссылка на объект который передали в нашем случаи 
   // это переменная x, которая является аргументом функции, меняется аргумент и только
   // сам параметр obj не поменялся - он как ссылся на x, так и ссылается
}
 
void b( int obj )
{
   obj++;
   // так как это копия нашего аргумента - аргумент останется неизменым после вызова функции данной,
   // а вот сама копия модифицируется, хоть пользователь этой функции об этом неузнает (((
}
 
int main( int argc, char* argv[] )
{
   int x = 15;
   show( x );
   f( x );
   show( x );
   b( x );
   show( x );
 
}
Объект x поменялся - могу такое же с пользовательским типом каким-то Foo - надо?
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
26.04.2016, 11:43 #10
Цитата Сообщение от akaAxeL Посмотреть сообщение
А приведите пожалуйста пример, когда аргумент поменяется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
const int f(int &a)
{
    a += a;
    return a;
}
 
int main(int argc, char *argv[])
{
    int b = 3;
    int c = f(b);
    c++;
    std::cout << b << std::endl;
    system("pause");
}
0
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
26.04.2016, 11:45 #11
Да все спасибо. Я думал можно как-то поменять без ссылки.
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
26.04.2016, 11:46 #12
akaAxeL, указатель)))))
0
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
26.04.2016, 12:06 #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
akaAxeL, указатель)))))
Вы про это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int f(int a)
{
    a++;
    return a;
}
int main(int argc, char *argv[])
{
    int y = 3;
    int *x=&y;
 
     y = f(y);
    cout << *x;
 
}
Добавлено через 6 минут
или вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int f(int *a)
{
    *a = *a+1;
    return *a;
}
int main(int argc, char *argv[])
{
    int y = 3;
    cout << f(&y);
    cout << y;
 
}
0
keep_clear
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 16
01.10.2017, 17:32 #14
Прошу привести пример использования, когда квалификатор const находится в указанном месте (именно для функции)
C++
1
int *const func() {...}
Логично, что функция func возвращает константный указатель на int.
Только вопрос: как его применить и увидеть результат, и когда требуется подобная конструкция?
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
01.10.2017, 18:48 #15
Не всё так просто:
C++
1
2
3
4
5
6
7
8
9
const int f(int a){    return a;    }
 
int main(int argc, char *argv[])
{
    int &&c = f(3);
 
    const int x = 200;
    int &value = x;
}
Добавлено через 17 минут
Knjagskij, const в стартовом примере просто игнорируется из-за бесполезности. На самом деле возвращается обычное int.

Добавлено через 7 минут
Но если бы возращался const int, Ваше x всё равно бы менялось. Причины Вам поясняли выше.
1
01.10.2017, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2017, 18:48
Привет! Вот еще темы с решениями:

Функция, возвращающая массив
Нужно вернуть из функции массив. int F(int a,int* b) { for(int...

Функция, возвращающая ссылку
Помогите исправить функцию, которая возвращает ссылку на массив size_t...

Функция возвращающая массив
#include &lt;iostream&gt; #include &quot;conio.h&quot; int *convertToBin() { int a = {...

Функция, возвращающая указатель
Нужно написать функцию, входящие параметры которой являются указателем на...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru