C/C++

Что такое вообще типы данных в с++? Что НЕ является типом данных

Помогите мне, пожалуйста, а то я уже все статьи перечитал и все равно не понимаю

Знаю, что есть основные типы данных и есть составные

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

Ведь перед объявлением функции мы указываем какого типа данных она будет

int Foo()
{}

Получается может быть так, что мы указываем тип данных другому типу данных ??
(Я не про то, когда меняется тип данных один на другой)
Vyacheslav G
Vyacheslav G
327
Значением имени Foo является указатель - адрес в памяти, по которому находится функция. Когда мы пишем Foo();, то запускаем выполнение кода, расположенного по этому адресу. Но просто Foo - без круглых скобок - это только адрес в памяти. И тип "функция" относится не к коду функции, а к адресу функции в памяти. Присваиваем и передаём как параметр не код функции, а адрес функции.

И в этом отношении указатель на функцию ничем не отличается от указателя на int. А тип - это всего лишь информация о смысле того, что содержится по указанному адресу. Если это целое - мы можем прибавить или отнять, умножить или разделить. А если функция - можем выполнить.
Игорь Панкратов
Игорь Панкратов
88 082
Лучший ответ
Ну вот, например, тип функции не является типом данных. А операции языка - не типы вообще и типов не имеют. Переменная - имеет тип, но типом не является. И т.п.
Тип данных - это название описания, как следует интерпретировать последовательность кодирующих какую-то информацию битов и какие операции и преобразования к этой последовательности можно применять.
<< Эротиус >>
<< Эротиус >>
84 839
Поясню Андрея.
Если функции имеют разные имена, но принимают одинаковые типы и возвращают тоже, то говорят, что функции однотипны.
Рафис Галиев
Рафис Галиев
93 224
Дom https://otvet.mail.ru/question/232007250
думаю чтобы оценить вопрос и что конкретно непонятно его автору, надо прочитать его предыдущий вариант.
ты не являешься типом
Зангар Анапин
Зангар Анапин
61 243
Как сказано Андреем:
 Тип - это информация о смысле того, что содержится по указанному адресу. 
То-есть указание компилятору как следует обрабатывать тот или иной участок памяти.
Имена функций и переменных - это все адреса имеющие понятное человеку значение.
Пример: имеем некоторую область памяти начиная с адреса 0000 размером 12 байт
 00 00 00 01 00 00 00 01 00 00 00 00 
Абсолютно не понятно что это и с чем его есть. Но если мы говорим компилятору что по адресам 0000, 0004 и 0008 находятся переменные типа unsigned int условно названные A B C, а компилятор знает, что unsigned int имеет размер 4 байта и знает как эти 4 байта интерпретировать, то сразу становится понятно что это три числа: A = 1, B = 1, C = 0;
А если понятно что это, то можно выполнить некторые действия, например С=A+B:
 00 00 00 01 00 00 00 01 00 00 00 02 
Теперь по адресу 0008 лежит число 2.
> не понимаю то, как например сама функция может являться типом данных?
Ответ на этот вопрос зависит от вашего образования. Если еще не закончили школу, то можете пока не заморачиваться. В высшей математике вводится понятие функционального пространства, элементами которого являются уже не числа, а функции и с этими функциями оперируют по правилам, подобным тем, которые используют, скажем, для операций с действительными числами.

В программировании аналогичным образом приходится использовать функторы (это объекты, классы которых реализуют operator(), позволяющий использовать такой объект-функтор как функцию) и обычные сишные функции, которые используют как переменную. Примером может быть например функтор std::negate, который если его вызвать с произвольным типом, поддерживающим операцию унарного минуса, вернет результат, имеющий этот же самый тип и со значением аргумента, к которому была применена эта операция унарного минуса.

Т.е. до момента, когда функция будет вызвана уже с какими-то аргументами, с ней (и другими функциями) возможно манипулировать абстрактно, без учета аргументов и прочего, создавая, например, некоторые комбинации и последовательности применения. Смысл этих действий, конечно, заключается в том, что рано или поздно все это будет вызвано уже с конкретными значениями.

> Ведь перед объявлением функции мы указываем какого типа данных она будет
int Foo() {}
Перед объявлением функции указывают тип возвращаемого значения. Когда говорится, что функция Foo имеет тип int, это означает, что она возвращает результат такого типа, а не то, что символ Foo - целое число. Если же в программе встретится Foo, то он будет иметь тип "указателя на функцию возвращающую целое число и не принимающую аргументов", вот именно в этом значении у функции имеется тип. Который, еще раз подчеркиваю, отличается от типа возвращаемого значения

>Получается может быть так, что мы указываем тип данных другому типу данных ??
Нет. Про возвращаемое значение см. выше, а тип этой самой объявленной функции (указателя на нее, он же символ Foo) на языке Си будет выглядеть как:
 int (*)() // Вот эту запись можно условно считать типом Foo

int (*t1)(); // А t1 и t2 - это уже переменные, имеющие тип,
int (*t2)(); // соответствующий функции Foo
auto t3 = Foo; // И t3, кстати, тоже
В си два плюса существует несколько основных типов данных
Здесь чётко и понятно описано что есть что и для чего: metanit.com/cpp/tutorial/2.3.php
Vyacheslav G Так это понятно про все эти инты и флоаты итд
Как может быть типом данных обычная функция

Говорится, что есть составные типы данных, но я никак это понять не могу
По идее, когда ты пишешь int FucnName(), то эта функция должна возвращать число (например, return 1), а если создашь string FuncName(), то она будет возвращать строку. Для меня бесполезное действие, но всяко этому найдется применение.
Например
 int main()
{
int result = ChoTo();
cout
Vyacheslav G Спасибо
Но вот это функция с каким-то типом данных, это я прекрасно понимаю

Но как сама функция может являться типом данных

Просто постоянно встречаю, когда всякие функции называют типом данных

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

Но как можно назвать обычную функцию типом данных, у которой и так есть тип данных
Не знаю как там на с++, но типы данных это:
Строка: 'Набор абсолютно любых символов113^€÷^hey'
Число: '123'
Число с плавающей запятой: '1.0', '2.5'
Vyacheslav G Спасибо
А что тогда такое int, double итд
Они же и есть типы данных
Тип: целочисленный например
Как можно обычный текст назвать не просто данными, а типом данных

Будто это определённый тип