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

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

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

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

19.08.2015, 08:48. Просмотров 1258. Ответов 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
6717 / 2900 / 497
Регистрация: 15.11.2014
Сообщений: 6,525
Завершенные тесты: 1
19.08.2015, 12:43 #16
Цитата Сообщение от Ilot Посмотреть сообщение
Тип функции check_pass:
string (*) (string)
Тип возвращаемого значения:
string
ложь.
это - тип указателя на функцию.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2015, 12:43 #17
Цитата Сообщение от Ilot Посмотреть сообщение
В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).
Еще компоновка по языку. По умолчанию это "С++", но можно задать и "С".
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 12:47 #18
Цитата Сообщение от hoggy Посмотреть сообщение
ложь.
это - тип указателя на функцию.
Давайте не будем:
Цитата Сообщение от Ilot Посмотреть сообщение
Сразу оговорюсь указатель можно опустить, потому как для функций, что указатель на нее что ее тип трактуется одинаково. Т.е. вызов равносилен:
C++
1
2
f1(...);
(*f1)(...);
0
hoggy
6717 / 2900 / 497
Регистрация: 15.11.2014
Сообщений: 6,525
Завершенные тесты: 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); // нельзя, указатель на функцию не умеет неявно приводиться к ссылке на функцию
    
}
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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);
}
0
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 562
19.08.2015, 13:03  [ТС] #21
Цитата Сообщение от Ilot Посмотреть сообщение
Еще раз тип функции это правило
Тип не может быть правилом. Мы о каком типе говорим? Возможно, под типом вы подразумеваете что-то другое?
Основные типы в С++ делятся на три категории: целочисленные, с плавающей запятой и void.
int это правило? string это правило?

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

Но вы не ответили на вопрос где в коде тип функции и где тип возвращаемого значения?
Мне не нужно знать, кто и что определяет, располагает и т.д. Я не прошу вас это рассказать.
Мне нужно 2 слова.

Смотрите
int a=5; //Слово int, тип данных int. Я понимаю. Вижу ключевое слово, обозначающее тип данных.
string check_pass (string password) // Вижу ключевое слово string. Что оно обозначает? Тип функции или тип возвращаемого значения?

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

Где второе слово? Откуда вы взяли что тип функции string? Как вы вычислили это? Этой информации нет в коде. Физически нет.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 13:18 #22
Цитата Сообщение от useruser Посмотреть сообщение
Вы понимаете, я уже час пытаюсь сказать - что должно быть 2 ключевых слова. Одно - тип функции, другое тип возвращаемого значения.
Два слова. А тут одно. В этом весь вопрос.
Ответ на этот вопрос прозвучал:
Цитата Сообщение от Ilot Посмотреть сообщение
В тип функции входит тип возвращаемого значения, типы входящих параметров и квалификаторы (const, volatile и т.д.).
Вам ответили на все вопросы. Читайте внимательнее.
0
smartpointer
69 / 63 / 24
Регистрация: 17.02.2014
Сообщений: 264
19.08.2015, 13:33 #23
useruser, У функции есть только возвращаемое значение и сигнатура в которую входит имя функции и его аргументы, больше там ничего нету (исключение - методы класса где добавляются некоторые другие особенности).
0
useruser
58 / 58 / 15
Регистрация: 29.06.2015
Сообщений: 562
19.08.2015, 13:36  [ТС] #24
Цитата Сообщение от Ilot Посмотреть сообщение
Читайте внимательнее.
Я внимательно читаю и не по одному разу. Стараюсь понять и сделать выводы. Но ответа на свой вопрос не получаю.

Хорошо, попробую по другому. Многие языки программирования схожи. В основном.
Код делфи.
Delphi
1
function ReturnNumber(inText: AnsiString): Int64;
Где здесь тип функции? Его нет. Если скажете, что Int64 -это тип функции, то приведу сообщение компилятора (при комментировании Int64).
function needs result type.
Обратимся к официальной справке разработчика. You have declared a function, but have not specified a return type.
Что означает - Вы объявили функцию, но не указали тип возвращаемого значения. Вывод - Int64 тип возвращаемого значения.
Где тип функции? Подозреваю, что его нет.

В с++ синтаксис другой, но количество операторов тоже, только изменено их расположение
C++
1
string check_pass (string password)
Практически полная аналогия.
Может нет никакого типа функции, а есть только тип возвращаемого значения?

Добавлено через 33 секунды
Цитата Сообщение от smartpointer Посмотреть сообщение
больше там ничего нету
Выше утверждают что есть.
Ищу уже 3 часа. Не могу понять где.
0
Jewbacabra
Эксперт PHP
2696 / 2284 / 850
Регистрация: 24.04.2014
Сообщений: 6,852
19.08.2015, 14:09 #25
Цитата Сообщение от useruser Посмотреть сообщение
Основные типы в С++ делятся на три категории: целочисленные, с плавающей запятой и void.
А как же массивы, указатели, классы, структуры, объединения, ссылки?
Цитата Сообщение от useruser Посмотреть сообщение
Где тип функции? Подозреваю, что его нет.
Он как суслик, ты его не видишь, но он есть.
Тут функция имеет тип Int64(AnsiString). как правильно записать это в delphi не знаю, но функциональные типы там то же есть
Функцию можно рассматривать как черный ящик, в который кладешь набор объектов, они как-то обрабатываются, и получается другой объект - возвращаемое значение.
Например
sin - принимает double, возвращает double.
Тип функции double(double). Тип Возвращаемого значения double.
cos - аналогично. Тип функции double(double), возвращаемое значение - double.
т.е. у функций sin и cos один и тот же и тип функций, и тип возвращаемого значения.
у функции с прототипом
C++
1
double foo(int);
тип double(int), а тип возвращаемого значения double.
тип возвращаемого значения такой же как у sin и cos, но тип функции уже другой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
using namespace std;
 
void calc(double func(double), double val) {
    cout << func(val) << endl;
}
 
double foo(int x) {
    return 0.1*x;
}
 
int main() {
    calc(cos, 0.0); // ok
    calc(sin, 0.0); // ok
    // calc(foo, 0.0); ошибка, тип 1 параметра не подходит
    return 0;
}
1
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
19.08.2015, 14:19 #26
Цитата Сообщение от useruser Посмотреть сообщение
Где здесь тип функции?
Int64 (AnsiString)

Ну если на С++.

double Sum(short a, const int b) - функция.
double - тип возвращаемого значения.
(short, const int) - аргументы.
double(short, const int) - тип функции.
Sum, a, b - переменные (в первой храниться функция заданного выше типа, в остальных аргументы).

Вместо одной функции можно безболезненно подставить другую функцию такого же типа.
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
19.08.2015, 14:24 #27
Цитата Сообщение от useruser Посмотреть сообщение
Где тип функции?
Давай по пунктам.
1) Ты пишешь функцию:
C++
1
int check_pass (string password);
здесь:
int - это тип возвращаемого значения функции
string - тип аргумента функции.
Здесь понятно?

2) Теперь переходим к типу функции. Вот есть запись:
C++
1
int check_pass (string password);
Это объявление функции. Объявление функции неявно содержит тип функции.
Т.е. задав функцию, ты сразу же задаешь и ее тип, как head-n-shoulders, в одном флаконе.
Явно тип функции записывается так (задается псевдоним типа через typedef):
C++
1
2
3
typedef int func_type(string); // тип функции с именем func_type, функция возвращает int, принимает string
typedef int(*fync_type_p)(string); // тип указателя на функцию fync_type_p
typedef int(&func_type_r)(string); // тип ссылки на функцию fync_type_r
Получить тип функции из определения функции можно также с помощью ключевого слова decltype. Например вот таким образом можно определить функцию, которая принимает другую функцию:
C++
1
2
3
4
5
6
7
8
int func(std::string v)
{
}
 
void func1(decltype(func) f)
{
    f("test");
}
Вот работоспособный пример в онлайн компиляторе: http://rextester.com/JRRAW96132
_____
Еще раз для закрепления: объявление функции неявно в себе содержит тип этой функции.
0
hoggy
6717 / 2900 / 497
Регистрация: 15.11.2014
Сообщений: 6,525
Завершенные тесты: 1
19.08.2015, 14:24 #28
Цитата Сообщение от Ilot Посмотреть сообщение
Попробуйте так:
Цитата Сообщение от Ilot Посмотреть сообщение
typedef void (*func)();
есть указатель на функцию

Цитата Сообщение от Ilot Посмотреть сообщение
void baz( const func& reference_func) {
есть ссылка на указатель, через который нельзя менять объект

Цитата Сообщение от Ilot Посмотреть сообщение
baz(&foo);
аргумент - указатель на функцию

итого: везде указатели.
ессна, это будет работать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
typedef void (&func)();
void foo() {
    std::cout << "Hello, world!\n";
}
void baz(  const func&  reference_func) {
    reference_func();
}
int main() {
 
    //error: invalid initialization of non-const reference of type ‘void (&)()’ from an rvalue of type ‘void (*)()’
    baz(&foo);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
typedef void (&func)();
void foo() {
    std::cout << "Hello, world!\n";
}
void baz(  const func  reference_func) {
    reference_func();
}
int main() {
 
     // error: invalid initialization of non-const reference of type ‘func {aka void (&)()}’ from an rvalue of type ‘void (*)()’
    baz(&foo);
}
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
19.08.2015, 14:54 #29
hoggy, опять лукавите. Ни один даже стандартный тип не кастует указатель на себя в ссылку:
C++
1
2
3
4
5
6
7
8
#include <iostream>
void br(int& a) {
    std::cout << "I'm br\n";
}
int main() {
    int c = 0;
    br(&c);
}
А что будет если убрать ссылку и использовать тип самой функции:
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(func reference_func) {
    reference_func();
}
int main() {
    baz(&foo); //<-- неявное преобразование func * к func
}
Все скомпилиться.
Однако:
C++
1
2
3
4
5
6
7
8
#include <iostream>
void bur(int r) {
    
}
int main() {
    int d = 0;
    bur(&d);//error: invalid conversion from 'int*' to 'int' [-fpermissive]|
}
0
hoggy
6717 / 2900 / 497
Регистрация: 15.11.2014
Сообщений: 6,525
Завершенные тесты: 1
19.08.2015, 19:00 #30
Цитата Сообщение от Ilot Посмотреть сообщение
Ни один даже стандартный тип не кастует указатель на себя в ссылку:
вот именно!

а из этого проистекает,
что функция и указатель на функцию - это не одно и тоже.

зато любой кастует себя к ссылке на себя.
что и иллюстрируют мои примеры выше.



Цитата Сообщение от Ilot Посмотреть сообщение
А что будет если убрать ссылку и использовать тип самой функции:
свободные функции подобно массивам умеют неявно каститься к указателям,

Цитата Сообщение от Ilot Посмотреть сообщение
Однако:
просто int - это и не функция, и не массив. и он такое не умеет.
0
19.08.2015, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2015, 19:00
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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