Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
useruser
 Аватар для useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 505
19.08.2015, 08:48     В чем разница между типом функции и типом возвращаемого значения? #1
Читаю статью
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;
}
-------------------------------


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

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

}

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

Функции с произвольным количеством и типом аргументов. C++
Шаблон функции с разным возвращаемым типом C++
C++ Ссылки на объекты в функции с не заданным типом переменных
C++ В чем смысл создания шаблона с заранее известным передаваемым типом
Преобразовать массив с типом char в массив с типом int C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
}
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 09:04     В чем разница между типом функции и типом возвращаемого значения? #3
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
useruser
 Аватар для useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 505
19.08.2015, 09:09  [ТС]     В чем разница между типом функции и типом возвращаемого значения? #4
Извините, не понял.

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

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

Цитата Сообщение от useruser Посмотреть сообщение
Я этот код вижу так
тип_возвращаемого_значения имя_функции (тип_аргумента аргумент_функции)
{
тело_функции
возвращаемое_значение_согласно_типу_возвращаемого_значения
}
Я что-то упустил. Код перед вами.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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)(...);
useruser
 Аватар для useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 505
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.
Возможно не существует никакого типа функции, а есть только тип возвращаемого значения?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.08.2015, 10:23     В чем разница между типом функции и типом возвращаемого значения? #7
Тип функции определяется типом возвращаемого значения и типом аргументов функции.

C++
1
string check_pass (string password) { /* ... */ }
Здесь тип возвращаемого значения - string. Тип же функции - это string (string), т.е. тип возвращаемого значения (это string) и тип аргумента (тоже string).
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
19.08.2015, 10:26     В чем разница между типом функции и типом возвращаемого значения? #8
Цитата Сообщение от useruser Посмотреть сообщение
Вот этого в моём коде нет.
http://www.cyberguru.ru/cpp/cpp-lang...p2-page67.html
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.08.2015, 10:26     В чем разница между типом функции и типом возвращаемого значения? #9
Цитата Сообщение от useruser Посмотреть сообщение
Я не вижу строки типа string string check_pass
Тип функции задаётся неявно при её объявлении. В отличии от обычных типов, когда объявление выглядит как <тип> <имя объекта>, для функций порядок другой: <тип возв. значения> <имя функции>(<тип аргумента1>, <тип аргумента2>, ..., <тип аргументаN>)
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 10:54     В чем разница между типом функции и типом возвращаемого значения? #10
Цитата Сообщение от useruser Посмотреть сообщение
Где в моём коде тип функции. В моём коде, не в вашем.
Вам уже несколько раз написали одно и тоже. В коде:
C++
1
string check_pass (string password)
check_pass - это имя переменной типа string (*) (string) (или string(string) что одно и тоже ). Более того я привел вам пример как работать с типами функций как с переменными "обычных" типов. Что не ясно?
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,672
19.08.2015, 11:09     В чем разница между типом функции и типом возвращаемого значения? #11
Цитата Сообщение от useruser Посмотреть сообщение
Читаю статью
Ваша ошибка заключается в том, что вы читаете статью непроверенного автора и полностью ей доверяете. Я уже писал как-то, что важно не только что сказано, но и кем сказано. Предпочтение нужно отдавать книгам умных и авторитетных авторов.
Цитата Сообщение от useruser Посмотреть сообщение
Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
Это ложь и глупость. Книжки читайте.
useruser
 Аватар для useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 505
19.08.2015, 11:31  [ТС]     В чем разница между типом функции и типом возвращаемого значения? #12
Цитата Сообщение от Ilot Посмотреть сообщение
Что не ясно?
Я не вижу в коде тип функции. Я не вижу ключевого слова.

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

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

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

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

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

Цитата Сообщение от useruser Посмотреть сообщение
Зачем вообще нужен тип функции? Функция по сути - набор кода. У него (неё) не может быть типа. Там объекты разных типов.
Для вызова функции следует поместить параметры в стек и сохранить точку вызова. Но число параметров может быть произвольным. Как тогда узнать адреса переданных в стек переменных и вернуться в точку вызова при завершении работы функции? Аналогично возвращаемые значения. Более подробно см. ассемблер.
useruser
 Аватар для useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 505
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 Посмотреть сообщение
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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.
Этот бред вообще боюсь комментировать...
Еще раз тип функции это правило для компилятора как располагать переменные в стеке перед вызовом процедуры, как с ними работать и как возвращать значение из функции.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
19.08.2015, 12:43     В чем разница между типом функции и типом возвращаемого значения? #16
Цитата Сообщение от Ilot Посмотреть сообщение
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
ложь.
это - тип указателя на функцию.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,672
19.08.2015, 12:43     В чем разница между типом функции и типом возвращаемого значения? #17
Цитата Сообщение от Ilot Посмотреть сообщение
В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).
Еще компоновка по языку. По умолчанию это "С++", но можно задать и "С".
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 12:47     В чем разница между типом функции и типом возвращаемого значения? #18
Цитата Сообщение от hoggy Посмотреть сообщение
ложь.
это - тип указателя на функцию.
Давайте не будем:
Цитата Сообщение от Ilot Посмотреть сообщение
Сразу оговорюсь указатель можно опустить, потому как для функций, что указатель на нее что ее тип трактуется одинаково. Т.е. вызов равносилен:
C++
1
2
f1(...);
(*f1)(...);
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
19.08.2015, 12:49     В чем разница между типом функции и типом возвращаемого значения? #19
Цитата Сообщение от Ilot Посмотреть сообщение
check_pass - это имя переменной типа string (*) (string) (или string(string) что одно и тоже )
ложь.

string(string) неявно может каститься к string (*) (string),
но это два принципиально разных типа

Добавлено через 51 секунду
Цитата Сообщение от Ilot Посмотреть сообщение
Давайте не будем:
Гайка, давай будем:

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>
 
void foo()
{
    std::cout << "Hello, world!\n";
}
 
 
void bar(  void func() )
{
    func();
}
 
void baz(  void(&reference_func)() )
{
    reference_func();
}
 
int main()
{
    bar( foo ); // можно, функция неявно приводится к указателю на функцию
    
    bar( &foo ); // можно, bar ожидает указатель на функцию
    
    baz(foo); // можно, передаем функцию по ссылке
    
    // error: invalid initialization of non-const reference of type ‘void (&)()’ from an rvalue of type ‘void (*)()’
    baz(&foo); // нельзя, указатель на функцию не умеет неявно приводиться к ссылке на функцию
    
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2015, 12:58     В чем разница между типом функции и типом возвращаемого значения?
Еще ссылки по теме:

C++ Как искать функции, работающие с определенным типом?
Функции с типом но без имени параметра C++
C++ Какова разница программы с возвращаемым целым значением и без возвращаемого значения

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 12:58     В чем разница между типом функции и типом возвращаемого значения? #20
hoggy, ошибаетесь коллега. Вы передаете временую переменную по неконстантной ссылке, что есть запрещено в С++ для любых типов. Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
typedef void (*func)();
void foo() {
    std::cout << "Hello, world!\n";
}
void baz(  const func&  reference_func) {
    reference_func();
}
int main() {
    baz(&foo);
}
Yandex
Объявления
19.08.2015, 12:58     В чем разница между типом функции и типом возвращаемого значения?
Ответ Создать тему
Опции темы

Текущее время: 08:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru