Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
1

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

19.08.2015, 08:48. Показов 2864. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2015, 08:48
Ответы с готовыми решениями:

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

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

Почему ковариантный тип может быть только типом возвращаемого значения метода?
Почему ковариантный тип T может быть только типом возвращаемого значения метода? Вот мои мысли: 1)...

Нужно переменной с типом real присвоить выражение a1 mod 2, где a1 - это переменная с типом integer.
Такой вопрос . Мне нужно переменной с типом real присвоить выражение a1 mod 2 где a1 это...

39
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,205
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
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
19.08.2015, 09:04 3
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
1
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
19.08.2015, 09:09  [ТС] 4
Извините, не понял.

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

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

Цитата Сообщение от useruser Посмотреть сообщение
Я этот код вижу так
тип_возвращаемого_значения имя_функции (тип_аргумента аргумент_функции)
{
тело_функции
возвращаемое_значение_согласно_типу_возвращаемого_значения
}
Я что-то упустил. Код перед вами.
0
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
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
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
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
846 / 777 / 258
Регистрация: 27.07.2012
Сообщений: 2,182
19.08.2015, 10:23 7
Тип функции определяется типом возвращаемого значения и типом аргументов функции.

C++
1
string check_pass (string password) { /* ... */ }
Здесь тип возвращаемого значения - string. Тип же функции - это string (string), т.е. тип возвращаемого значения (это string) и тип аргумента (тоже string).
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 10:26 8
Цитата Сообщение от useruser Посмотреть сообщение
Вот этого в моём коде нет.
http://www.cyberguru.ru/cpp/cp... age67.html
0
846 / 777 / 258
Регистрация: 27.07.2012
Сообщений: 2,182
19.08.2015, 10:26 9
Цитата Сообщение от useruser Посмотреть сообщение
Я не вижу строки типа string string check_pass
Тип функции задаётся неявно при её объявлении. В отличии от обычных типов, когда объявление выглядит как <тип> <имя объекта>, для функций порядок другой: <тип возв. значения> <имя функции>(<тип аргумента1>, <тип аргумента2>, ..., <тип аргументаN>)
0
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
19.08.2015, 10:54 10
Цитата Сообщение от useruser Посмотреть сообщение
Где в моём коде тип функции. В моём коде, не в вашем.
Вам уже несколько раз написали одно и тоже. В коде:
C++
1
string check_pass (string password)
check_pass - это имя переменной типа string (*) (string) (или string(string) что одно и тоже ). Более того я привел вам пример как работать с типами функций как с переменными "обычных" типов. Что не ясно?
0
Эксперт С++
3207 / 1734 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2015, 11:09 11
Цитата Сообщение от useruser Посмотреть сообщение
Читаю статью
Ваша ошибка заключается в том, что вы читаете статью непроверенного автора и полностью ей доверяете. Я уже писал как-то, что важно не только что сказано, но и кем сказано. Предпочтение нужно отдавать книгам умных и авторитетных авторов.
Цитата Сообщение от useruser Посмотреть сообщение
Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
Это ложь и глупость. Книжки читайте.
2
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
19.08.2015, 11:31  [ТС] 12
Цитата Сообщение от Ilot Посмотреть сообщение
Что не ясно?
Я не вижу в коде тип функции. Я не вижу ключевого слова.

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

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

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

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

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

Цитата Сообщение от useruser Посмотреть сообщение
Зачем вообще нужен тип функции? Функция по сути - набор кода. У него (неё) не может быть типа. Там объекты разных типов.
Для вызова функции следует поместить параметры в стек и сохранить точку вызова. Но число параметров может быть произвольным. Как тогда узнать адреса переданных в стек переменных и вернуться в точку вызова при завершении работы функции? Аналогично возвращаемые значения. Более подробно см. ассемблер.
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
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
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
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
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,205
19.08.2015, 12:43 16
Цитата Сообщение от Ilot Посмотреть сообщение
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
ложь.
это - тип указателя на функцию.
0
Эксперт С++
3207 / 1734 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2015, 12:43 17
Цитата Сообщение от Ilot Посмотреть сообщение
В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).
Еще компоновка по языку. По умолчанию это "С++", но можно задать и "С".
0
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
19.08.2015, 12:47 18
Цитата Сообщение от hoggy Посмотреть сообщение
ложь.
это - тип указателя на функцию.
Давайте не будем:
Цитата Сообщение от Ilot Посмотреть сообщение
Сразу оговорюсь указатель можно опустить, потому как для функций, что указатель на нее что ее тип трактуется одинаково. Т.е. вызов равносилен:
C++
1
2
f1(...);
(*f1)(...);
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,205
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); // нельзя, указатель на функцию не умеет неявно приводиться к ссылке на функцию
    
}
0
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
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);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2015, 12:58

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

Передача значения с типом DateTime в метод
Есть класс, в котором присутствует поле с типом DateTime, есть конструктор, принимающий в качестве...

В чем смысл создания шаблона с заранее известным передаваемым типом
Видел шаблоны типа: template&lt;int N&gt; struct fact{ static const int v = fact&lt;n-1&gt;::v * n; };...

Нужно перевести переменную с типом данных string в переменную с типом данных REAL
Итак, нужно перевести переменную с типом данных string в переменную с типом данных REAL. Переменную...

Перевод значения переменной с типом string в time
Есть переменая dtime с типом string в этой переменной указано время dtime:= '0:22:45'; ...

Присвоение значения полю с логическим типом в отчёте
Доброго дня, коллеги! Не уверен, что правильно сформулировал тему. Вопрос такой: В таблице...


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

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

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