Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 553
#1

В чем разница между типом функции и типом возвращаемого значения? - C++

19.08.2015, 08:48. Просмотров 1229. Ответов 39
Метки нет (Все метки)

Читаю статью
https:// code-live. ru/post/cpp-functions/ (ссылку изменил дабы не делать рекламу)

Там написано
- Любая функция имеет тип, также, как и любая переменная.
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.

Пример
-----------------------------
C++
1
2
3
4
5
6
7
8
9
10
11
string check_pass (string password)
{
    string valid_pass = "qwerty123";
    string error_message;
    if (password == valid_pass) {
        error_message = "Доступ разрешен.";
    } else {
        error_message = "Неверный пароль!";
    }
    return error_message;
}
-------------------------------


Я этот код вижу так

тип_возвращаемого_значения имя_функции (тип_аргумента аргумент_функции)
{
тело_функции
возвращаемое_значение_согласно_типу_возвращаемого_значения

}

Что такое тип функции (он тут есть?), в чем разница между типом функции и типом возвращаемого значения и как тип функции и тип возвращаемого значения могут различаться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2015, 08:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем разница между типом функции и типом возвращаемого значения? (C++):

Нужно сделать чтобы можно было управлять типом возвращаемого значения функции - C++
// avg_function.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace...

Преобразовать массив с типом char в массив с типом int - C++
Что-то не получается у меня найти инфу именно с преобразованием массивов с char в int. Нахожу только преобразование с числами. ...

В чем смысл создания шаблона с заранее известным передаваемым типом - C++
Видел шаблоны типа: template<int N> struct fact{ static const int v = fact<n-1>::v * n; }; Объясните мне, в чем смысл...

Какова разница программы с возвращаемым целым значением и без возвращаемого значения - C++
Доброго времени суток! Подскажите, в чём разница программ с возвращаемым целочисленным значением и без возвращаемого значения? ...

Функции с произвольным количеством и типом аргументов. - C++
Начал изучать ф-ции с определенным количеством параметров и при изучении возник вопрос, а именно: #include <iostream> using...

Функции с типом но без имени параметра - C++
Добрый день. Встретил следующую функцию: void f(int) { //код } //почему не так ? void f1(int i) { //код }

39
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
19.08.2015, 08:54 #2
Цитата Сообщение от useruser Посмотреть сообщение
Что такое тип функции
в вашей терминологии тип функции имеет вид:

тип_возвращаемого_значения(тип_аргумента);

пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
// функция имеет тип имеет тип void()
void foo() { std::cout<<"foo()\n"; }
 
 
void bar(  void f() ) //<--- принимает объект "функцию" по имени f, которая имеет тип void()
{
    f();
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    bar(foo);  //<--- передаем объект-функцию foo, как аргумент функции bar
}
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 09:04 #3
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
1
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 553
19.08.2015, 09:09  [ТС] #4
Извините, не понял.

Исходя из написанного в статье
Цитата Сообщение от useruser Посмотреть сообщение
Любая функция имеет тип
Цитата Сообщение от useruser Посмотреть сообщение
Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции
делаю вывод - Есть тип функции и тип возвращаемого значения. Т.е. 2 объекта, образно выражаясь.
В чем между ними разница и где один из объектов?
Я нашел только тип_возвращаемого_значения.
Предположу - может и нет никакого типа функции и в статье ошибка?

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
Откуда вы это взяли? В коде этого нет. Выше нигде не описано.

Цитата Сообщение от useruser Посмотреть сообщение
Я этот код вижу так
тип_возвращаемого_значения имя_функции (тип_аргумента аргумент_функции)
{
тело_функции
возвращаемое_значение_согласно_типу_возвращаемого_значения
}
Я что-то упустил. Код перед вами.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 10:00 #5
Цитата Сообщение от useruser Посмотреть сообщение
Откуда вы это взяли? В коде этого нет.
Это такой тонкий троллинг? А вот этот код в первом посте кто разместил?
C++
1
2
3
4
string check_pass (string password)
{
    ...
}
Тип функции будет определяться как:
C++
1
2
3
4
5
6
7
8
typedef string (*func) (string password);
...
string check_pass (string password)
{
    ...
}
 
func f1 = check_pass; //<-- Функция f1 имеет тип string (*) (string password)
С типов возвращаемого значения все должно быть ясно...
Сразу оговорюсь указатель можно опустить, потому как для функций, что указатель на нее что ее тип трактуется одинаково. Т.е. вызов равносилен:
C++
1
2
f1(...);
(*f1)(...);
0
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 553
19.08.2015, 10:11  [ТС] #6
Цитата Сообщение от Ilot Посмотреть сообщение
Это такой тонкий троллинг?
Нет. Даже не думал.

Цитата Сообщение от Ilot Посмотреть сообщение
А вот этот код в первом посте кто разместил?
Я разместил.

Цитата Сообщение от Ilot Посмотреть сообщение
typedef string (*func) (string password);
Вот этого в моём коде нет.

Всё равно не понимаю. Вопрос простой. Где в моём коде тип функции. В моём коде, не в вашем.
В моём коде есть функция - зачит должен быть указан её тип. Где он указан? Номер строки, ключевое слово...
В этом коде я ищу 2 объекта. Один тип возвращаемого значения, другой тип функции. Где они?

Цитата Сообщение от useruser Посмотреть сообщение

string check_pass (string password)
{
* * string valid_pass = "qwerty123";
* * string error_message;
* * if (password == valid_pass) {
* * * * error_message = "Доступ разрешен.";
* * } else {
* * * * error_message = "Неверный пароль!";
* * }
* * return error_message;
}

Тип возвращаемого значения - предполагаю, что string т.к. string check_pass.
Где тип функции? Я не вижу строки типа string string check_pass.
Возможно не существует никакого типа функции, а есть только тип возвращаемого значения?
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
19.08.2015, 10:23 #7
Тип функции определяется типом возвращаемого значения и типом аргументов функции.

C++
1
string check_pass (string password) { /* ... */ }
Здесь тип возвращаемого значения - string. Тип же функции - это string (string), т.е. тип возвращаемого значения (это string) и тип аргумента (тоже string).
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
19.08.2015, 10:26 #8
Цитата Сообщение от useruser Посмотреть сообщение
Вот этого в моём коде нет.
http://www.cyberguru.ru/cpp/cpp-language-straustrup2-page67.html
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
19.08.2015, 10:26 #9
Цитата Сообщение от useruser Посмотреть сообщение
Я не вижу строки типа string string check_pass
Тип функции задаётся неявно при её объявлении. В отличии от обычных типов, когда объявление выглядит как <тип> <имя объекта>, для функций порядок другой: <тип возв. значения> <имя функции>(<тип аргумента1>, <тип аргумента2>, ..., <тип аргументаN>)
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 10:54 #10
Цитата Сообщение от useruser Посмотреть сообщение
Где в моём коде тип функции. В моём коде, не в вашем.
Вам уже несколько раз написали одно и тоже. В коде:
C++
1
string check_pass (string password)
check_pass - это имя переменной типа string (*) (string) (или string(string) что одно и тоже ). Более того я привел вам пример как работать с типами функций как с переменными "обычных" типов. Что не ясно?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2015, 11:09 #11
Цитата Сообщение от useruser Посмотреть сообщение
Читаю статью
Ваша ошибка заключается в том, что вы читаете статью непроверенного автора и полностью ей доверяете. Я уже писал как-то, что важно не только что сказано, но и кем сказано. Предпочтение нужно отдавать книгам умных и авторитетных авторов.
Цитата Сообщение от useruser Посмотреть сообщение
Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
Это ложь и глупость. Книжки читайте.
2
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 553
19.08.2015, 11:31  [ТС] #12
Цитата Сообщение от Ilot Посмотреть сообщение
Что не ясно?
Я не вижу в коде тип функции. Я не вижу ключевого слова.

Напишите string string check_pass (string password) и вопросов нет. Вот тебе 2 типа, имя функции и т.д. 2 типа.
Но тут 1 тип, одно слово string. Понимаете? Где второе слово? Его нет.

Если одно слово string определяет и тип функции и тип возвращаемого значения, то как в этом случае будет запись когда тип функции и тип возвращаемого значения - разный?

PS
Возникают ещё вопросы
Зачем вообще нужен тип функции? Функция по сути - набор кода. У него (неё) не может быть типа. Там объекты разных типов.
А вот тип возвращаемого значения нужен - мы должны знать данные какого типа мы возвращаем т.к. язык С++ язык с явной типизацией.

Добавлено через 2 минуты
Цитата Сообщение от Mr.X Посмотреть сообщение
Ваша ошибка заключается в том, что вы читаете статью непроверенного автора и полностью ей доверяете.
Если бы я доверял, разве я бы спросил вас (на форуме)? Тот кто доверяет - тот не проверяет. ) Я пытаюсь понять, спрашиваю...
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 11:53 #13
Цитата Сообщение от useruser Посмотреть сообщение
Я пытаюсь понять, спрашиваю...
Не пытаетесь...
Тип функции и тип возвращаемого значения это немного из разных песочниц. В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).

Цитата Сообщение от useruser Посмотреть сообщение
Если одно слово string определяет и тип функции и тип возвращаемого значения, то как в этом случае будет запись когда тип функции и тип возвращаемого значения - разный?
Они по определению разные и не могут совпадать никогда.

Цитата Сообщение от useruser Посмотреть сообщение
Зачем вообще нужен тип функции? Функция по сути - набор кода. У него (неё) не может быть типа. Там объекты разных типов.
Для вызова функции следует поместить параметры в стек и сохранить точку вызова. Но число параметров может быть произвольным. Как тогда узнать адреса переданных в стек переменных и вернуться в точку вызова при завершении работы функции? Аналогично возвращаемые значения. Более подробно см. ассемблер.
0
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 553
19.08.2015, 12:29  [ТС] #14
Цитата Сообщение от Ilot Посмотреть сообщение
В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).
Вы хотите сказать, что тип функции не важен, не указывается и определяется размером наибольшего типа аргумента (аргументов) в байтах?
bool true_or_false (int a){} //Тип возвращаемого значения bool, тип функции int т.к. int 4 байт, а bool 1.

Цитата Сообщение от Ilot Посмотреть сообщение
Они по определению разные и не могут совпадать никогда.
int func(int a){} //Одинаковые типы.

Ну и в статье написано, хотя я не сильно ей доверяю, но всё же
Цитата Сообщение от useruser Посмотреть сообщение
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 12:41 #15
Цитата Сообщение от useruser Посмотреть сообщение
int func(int a){} //Одинаковые типы.
Тип функции int(int) тип возвращаемого значени int.
Цитата Сообщение от useruser Посмотреть сообщение
Вы хотите сказать, что тип функции не важен, не указывается и определяется размером наибольшего типа аргумента (аргументов) в байтах?
bool true_or_false (int a){} //Тип возвращаемого значения bool, тип функции int т.к. int 4 байт, а bool 1.
Этот бред вообще боюсь комментировать...
Еще раз тип функции это правило для компилятора как располагать переменные в стеке перед вызовом процедуры, как с ними работать и как возвращать значение из функции.
0
19.08.2015, 12:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2015, 12:41
Привет! Вот еще темы с ответами:

Функции для работы с типом char* - C++
Здравствуйте! Подскажите ресурс, где описана реализация основных функции для работы с указателями на строки

Шаблон функции с разным возвращаемым типом - C++
Доброго времени суток! Возникла необходимость написать шаблон функции, которая будет возвращать значение, тип которого отличен от типа...

Ссылки на объекты в функции с не заданным типом переменных - C++
Как правильно передавать ссылки на объекты в функции с не заданным типом переменных и возможно ли это? Для общего случая я это...

Как искать функции, работающие с определенным типом? - C++
Всем привет! Сейчас у меня типичная нудная задача: создать строку wchar_t, конвертировать цифру из int в wchar_t, затем склеить...


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

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

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