Чем определение отличается от объявления
Перейти к содержимому

Чем определение отличается от объявления

  • автор:

Функции

Функция определяет действия, которые выполняет программа. Функции позволяют выделить набор инструкций и назначить ему имя. А затем многократно по присвоенному имени вызывать в различных частях программы. По сути функция — это именованный блок кода.

Формальное определение функции выглядит следующим образом:

тип имя_функции(параметры)

Первая строка представляет заголовок функции. Вначале указывается возвращаемый тип функции. Если функция не возвращает никакого значения, то используется тип void .

Затем идет имя функции, которое представляет произвольный идентификатор. К именованию функции применяются те же правила, что и к именованию переменных.

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

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

Для возвращения результата функция применяет оператор return . Если функция имеет в качестве возвращаемого типа любой тип, кроме void, то она должна обязательно с помощью оператора return возвращать какое-либо значение.

Например, определение функции main, которая должна быть в любой программе на языке C++ и с которой начинается ее выполнение:

int main()

Возвращаемым типом функции является тип int , поэтому функция должна использовать оператор return и возвращать какое-либо значение, которое соответствует типу int. Возвращаемое значение ставится после оператора return.

Стоит отметить, что С++ позволяет не использовать оператор return в функции main:

int main()

Но если функция имеет тип void , то ей не надо ничего возвращать. Например, мы могли бы определить следующую функцию, которая просто выводит некоторый текст на консоль:

void hello()

Выполнение функции

Когда запускается программа на языке C++, то запускается функция main. Никакие другие функции, определенные в программе, автоматически не выполняются. Для выполнения функции ее необходимо вызвать. Вызов функции осуществляется в форме:

имя_функции(аргументы);

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

Например, определим и выполним простейшую функцию:

#include void hello() < std::cout int main()

Здесь определена функция hello, которая вызывается в функции main два раза. В этом и заключается преимущество функций: мы можем вынести некоторые общие действия в отдельную функцию и затем вызывать многократно в различных местах программы. В итоге программа два раза выведет строку «hello».

hello hello

Объявление функции

При использовании функций стоит учитывать, что компилятор должен знать о функции до ее вызова. Поэтому вызов функции должен происходить после ее определения, как в случае выше. В некоторых языках это не имеет значение, но в языке C++ это играет большую роль. И если, к примеру, мы сначала вызовем, а потом определим функцию, то мы получим ошибку на этапе компиляции, как в следующем случае:

#include int main() < hello(); hello(); >void hello()

В этом случае перед вызовом функции надо ее дополнительно объявить. Объявление функции еще называют прототипом. Формальное объявление выглядит следующим образом:

тип имя_функции(параметры);

Фактически это заголовок функции. То есть для функции hello объявление будет выглядеть следующим образом:

void hello();

Используем объявление функции:

#include void hello(); int main() < hello(); hello(); >void hello()

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

Чем отличается определение от объявления в C++ ?Можно на примере функции и поподробнее.

Объявление дает компилятору необходимый минимум для того, чтобы он мог организовать вызов объявленного, еще не зная, что внутри него. На примере функции:
bool fun(int);
Определение описывает, что функция делает:
bool fun(int k)0;>

Остальные ответы

Объявление — говорим компилятору, что есть такая вот функция. Он резервирует ее имя, запоминает параметры и возвращаемое значение. Ключевое слово extern не обязательно, если функция объявляется первый раз. Но от него хуже не будет.

extern int my_func(float p);

Определение — это «тело» функции. Тут компилятор привызывает адрес, по которому находится код, к имени функции.

int my_func(float p)
<
return 0;
>

как то так, объявление объявяляет функцию а определение как правило определяет в ней переменные, через тот же знак присваивания. Сами же слова и подсказывают

Отличие объявления, определения и инициализации

Читаю тут книжицу по C++, учусь потихоньку.
И возник у меня вопрос нерядового характера: в чём фундаментальное отличие объявления, определения и инициализации? В книге всё намешано, ничего не понятненько.

Однако усёк, что они говаривают, будто такая строка:

int a = 3;

не просто присваивание переменной значения, а что-то большее.
И как-то это связано с созданием экземпляров классов.

А ещё пишут, что есть инициализация прямая и инициализация копии.
А потом вот это кажут:

int val = 1024; int val (1024);

И говаривают, будто val в обоих случаях будет одинаковой.

Что-то я видно не секу истинной сути.
Помогите словцом мудрым.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Правила объявления инициализации
Напишите основные — самые главные правила обьявления инициализации.

В чём отличие разных способов объявления переменных?
в чем отличие int a(2); от int a=2; И как писать правильней

Сложные определения и объявления
Решил создать отдельный топик т.к. ну совсем никак не могу разобраться (все взято с книги) есть.

Объявления и определения структур
Может кто-нибудь объяснить как это работает: //Source1.cpp #include "pch.h" #include.

Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

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

не просто присваивание переменной значения, а что-то большее.
инициализация. Можете расценивать как

int a(3);

Регистрация: 02.08.2012
Сообщений: 15

А разница-то в чём между инициализацией, объявлением и определением?
И какой смысл иметь две разные штуки для одного и того же:

int val = 1024; int val (1024);

Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

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

А разница-то в чём между инициализацией, объявлением и определением?
Вопрос чем они связаны

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

И какой смысл иметь две разные штуки для одного и того же:
а какой смысл иметь черный чай и зеленый, все равно трава
Регистрация: 02.08.2012
Сообщений: 15

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

а какой смысл иметь черный чай и зеленый, все равно трава

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

И да, чем связаны инициализация, объявление и определение?

Регистрация: 04.06.2013
Сообщений: 10

1 2 3 4 5 6 7
class foo { public: //Не обращай внимания с: int a; //Объявление foo(int _a) : a(_a) {} //Это функция конструктора, которая вызывается при создании переменной класса }; foo a(5);

Это означает, что будет объявлен и инициализирован класс foo, причем инициализирован со значением 5. Это значение попадет классу в переменную a. Вот зачем нужны скобочки.

Согласно смыслу этих трех слов, можно предположить что они означают
Объявление — мы говорим что переменная будет.
Определение — мы указываем какой она будет.
Инициализации — тут мы используем скобочки, которые «запускают» переменную через конструктор.
Инициализация — это определение, но определение не инициализация(в какой-то мере).
Вероятно это так.

Разница между объявлением и определением в c и C++ Текст научной статьи по специальности «Компьютерные и информационные науки»

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Гагарин Вячеслав Юрьевич

В данной статье рассматривается различие между « определением » и « объявлением » класса, переменной или функции в языках С/С++; рассказывается о том, как избежать возникновения нестандартных ошибок из-за неправильного « определения » или « объявления » класса , переменной или функции .

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Гагарин Вячеслав Юрьевич

Динамически загружаемые библиотеки: структура, архитектура и применение
Анализ сущностей программ на языках Си/Си++ и связей между ними для понимания программ
Абстрактные базовые классы
Массивы данных в языке программирования C++
Динамически загружаемые библиотеки: структура, архитектура и применение (часть 2)
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

DIFFERENCE BETWEEN THE ANNOUNCEMENT AND DEFINITION IN C AND C ++

In this article is considered distinction between « definition » and « announcement » of a class , variable or function ; describes, how to avoid non-standard errors due to incorrect «definitions» or « announcement » of a class , variable or function .

Текст научной работы на тему «Разница между объявлением и определением в c и C++»

ЭЛЕКТРОННЫЙ НАУЧНЫЙ ЖУРНАЛ «APRIORI. ^РИЯ: ЕСТЕСТВЕННЫЕ И ТЕХНИЧЕСКИЕ НАУКИ»

РАЗНИЦА МЕЖДУ ОБЪЯВЛЕНИЕМ И ОПРЕДЕЛЕНИЕМ В C И C++

Гагарин Вячеслав Юрьевич

Мордовский государственный университет им. Н.П. Огарева, Саранск

Аннотация. В данной статье рассматривается различие между «определением» и «объявлением» класса, переменной или функции в языках С/С++; рассказывается о том, как избежать возникновения нестандартных ошибок из-за неправильного «определения» или «объявления» класса, переменной или функции.

Ключевые слова: объявление, определение, C, C++, ошибка, extern, класс, функция, переменная.

DIFFERENCE BETWEEN THE ANNOUNCEMENT AND DEFINITION IN C AND C ++

Gagarin Vyacheslav Yuryevich

Ogarev Mordovia State University, Saransk

Abstract. In this article is considered distinction between «definition» and «announcement» of a class, variable or function; describes, how to avoid non-standard errors due to incorrect «definitions» or «announcement» of a class, variable or function.

Key words: announcement, definition, C, C++, error, extern, class, function, variable.

Если говорить об истории развития этих языков, то первоначально появился язык C, а уже впоследствии как развитие языка C появился и C++. Язык C оказал большое влияние на индустрию разработки программного обеспечения. С одной стороны, синтаксис многих его инструкций лежит в основе таких языков, как С++, С#, Java, PHP. С другой, он используется в качестве промежуточного в некоторых системах программирования, когда программа сначала транслируется в программу на языке С и только потом компилируется компилятором языка С для получения окончательного исполняемого модуля [1]. Для аналогичных целей используется и язык C++, но его важным отличием от языка C является поддержка технологии ООП.

В C и C++ существует одно маленькое, но важное различие между «объявлением» и «определением» класса, переменной или функции. Необходимо понимать разницу между значением этих слов, иначе вы часто будете натыкаться на странные ошибки, такие как:

undefined reference to vtable for foo (в C++)

undefined symbol foo

undefined reference to foo

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

файлах. То есть можно объявить функцию, но писать тело функции в каждом из файлов не нужно.

Иными словами, «объявление» выглядит так:

Оно не включает тело функции, но сообщает компилятору, что она (функция) будет определена где-то позже, поэтому компилятор может использовать её.

А вот «определение» означает описание всей необходимой информации для создания того, что мы определяем, целиком. Описание всех полей, методов и свойств класса есть «определение» класса. Описание тела функции есть «определение» функции. Конечно, вы можете как объявлять классы, переменные или функции, так и определять их одновременно. Но вам это не нужно, потому что, как только что-то определено, оно считается и объявленным.

Для компилятора часто достаточно просто «объявления».

double a = function();

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

Объявим класс, не определяя его:

Попробуем узнать, что находится в MyFirstClass. Напишем следующий код:

class MyFirstClass; MyFirstClass aza_obj;

Данный фрагмент кода вызовет ошибку, потому что компилятор не знает размер переменной aza_obj, а из «объявления» MyFirstClass он его узнать не может; ему нужно «определение», которое появляется ниже.

В большинстве случаев, когда вы объявляете переменную, вы также определяете ее. Поэтому «определение» переменной означает, что вы говорите компилятору, где выделить место для хранения этой переменной.

Напишем такой код:

Строка double х и определяет, и объявляет переменную. На более простом языке это означает: «создать переменную с именем х, типа double». При этом место, где хранится переменная, определяется тем, что это глобальная переменная, определенная в объектный файл, связанный с этим исходным файлом.

Создадим второй исходный файл, имеющий такой исходный код:

extern double x;

Использование extern позволяет объявить переменную, не определяя ее, extern сообщает, что переменная находится где-то в другом месте. Спецификатор extern играет большую роль в программах, состоящих из многих файлов. В языках СЮ++ программа может быть записана в нескольких файлах, которые компилируются раздельно, а затем компонуются в одно целое. В этом случае необходимо как-то сообщить всем файлам о глобальных переменных программы. Самый лучший (и наиболее переносимый) способ сделать это — определить (описать) все глобальные переменные в одном файле и объявить их со спецификатором extern в остальных файлах [2].

Напишем следующий код:

extern double x;

В данном примере «определение» переменной x находится внизу, а «объявление» в верхней части программы.

Если в заголовке файла поставить переменную и не использовать extern, то возникнет обратная задача неопределенного символа [3], то есть у вас будет символ с несколькими определениями с ошибкой типа:

redefinition of foo

Это произойдет, когда компоновщик будет связывать объектные файлы.

В общем случае «объявление» предоставляет основные свойства символа: название и тип. «Определение» предоставляет все детали этого символа — если это класс, то какие у него методы, поля и свойства; если это функция, то что она вычисляет; если это переменная, то где эта переменная хранится. Часто компилятору нужно «объявление», чтобы скомпилировать файл в объектный файл, так как компоновщик может найти «определение» из другого файла. Если исходный файл объявлен, но символ он не определяет, то во время компоновки будут возникать ошибки, сообщающие о неопределенных символах [4].

Если вы хотите использовать функцию в нескольких исходных файлах, вы должны объявить функцию в одном заголовочном файле (.h), а затем определить функцию в одном исходном файле (.с или .cpp). Весь код, который использует функция должен включать в себя только .h файл, и вам надо связать полученные объектные файлы с объектным файлом от компиляции исходного файла.

Если вы хотите использовать переменную в нескольких файлах, вы должны объявить переменную с помощью ключевого слова extern в одном заголовочном файле, а затем включить этот заголовочный файл во все исходные файлы, которым нужна эта переменная. Затем вы должны

определить эту переменную в одном исходном файле, который связан со всеми объектными файлами, которые используют эту переменную.

Если вы хотите использовать класс в нескольких файлах, вы должны поместить «определение» класса в заголовочный файл и определить методы класса в соответствующем исходном файле.

Список использованных источников

1. Александров Э.Э., Афонин В.В. Введение в программирование на языке С. Саранск: Изд-во Мордов. ун-та, 2009. 5 с.

2. Александров Э.Э., Афонин В.В. Программирование на языке С в Microsoft Visual Studio 2010 [Электронный ресурс]. Режим доступа: http://www.intuit.ru/department/pl/prcmsvs2010 (дата обращения: 25.11.2015).

3. Таненбаум Э. Современные операционные системы. СПб., 2010. 972 с.

4. Прата С. Язык программирования С. Лекции и упражнения. М.: Ви-льямс, 2006. 256 с.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *