Основы языка программирования C++
Программа на С++ состоит из набора инструкций. Каждая инструкция (statement) выполняет определенное действие. В конце инструкции в языке C++ ставится точка с запятой (;). Данный знак указывает компилятору на завершение инструкции. Например:
std::coutДанная строка выводит на консоль строку "Hello world!", является инструкцией и поэтому завершается точкой с запятой.
Набор инструкций может представлять блок кода. Блок кода заключается в фигурные скобки, а инструкции помещаются между открывающей и закрывающей фигурными скобками:
В этом блоке кода две инструкции, которые выводят на консоль определенную строку.
Функция main
Каждая программа на языке С++ должна иметь как минимум одну функцию - функцию main() . Именно с этой функции начинается выполнение приложения. Ее имя main фиксировано и для всех программ на С++ всегда одинаково.
Функция также является блоком кода, поэтому ее тело обрамляется фигурными скобками, между которыми определяется набор инструкций.
В частности, при создании первой программы использовалась следующая функция main:
#include // подключаем заголовочный файл iostream int main() // определяем функцию main < // начало функции std::cout // конец функцииОпределение функии main начинается с возвращаемого типа. Функция main в любом случае должна возвращать число. Поэтому ее определение начинается с ключевого слова int .
Далее идет название функции, то есть main . После названия в скобках идет список параметров. В данном случае функция main не принимает никаких параметров, поэтому после названия указаны пустые скобки. Однако есть другие варианты определения функции main, которые подразумевыют использование параметров. В частности, нередко может встречаться следующее определение функции main, использующей параметры:
int main (int argc, char *argv[])
И после списка параметров идет блок кода, который и содержит в виде инструкций собственно те действия, выполняемые функцией main.
В конце функции идет инструкция return :
return 0;Эта инструкция завершает выполнение функции, передавая управление во вне туда, где была вызвана функция. В случае с функцией main контроль передается операционной системе.
Число 0 после оператора return указывает операционной системе, что выполнение функции завершилось успешно, без ошибок.
Также стоит отметить, что в функции main можно опустить инструкцию return 0; :
#include int main()
Директивы препроцессора
В примере выше на консоль выводится строка, но чтобы использовать вывод на консоль, необходимо в начале файла с исходным кодом подключать библиотеку iostream с помощью директивы include .
#include // подключаем библиотеку iostreamДиректива include является директивой препроцессора. Каждая директива препроцессора размещается на одной строке. И в отличие от обычных инструкциий языка C++, которые завершаются точкой с запятой ; , признаком завершения препроцессорной директивы является перевод на новую строку. Кроме того, директива должна начинаться со знака решетки #. Непосредственно директива "include" определяет, какие файлы и библиотеки надо подключить в данном месте в код программы.
Комментарии
Исходный код может содержать комментарии. Комментарии позволяют понять смысл программы, что делают те или иные ее части. При компиляции комментарии игнорируются и не оказывают никакого влияние на работу приложения и на его размер.
В языке C++ есть два типа комментариев: однострочный и многострочный. Однострочный комментарий размещается на одной строке после двойного слеша //:
#include // подключаем библиотеку iostream int main() // определяем функцию main < // начало функции std::cout // конец функцииМногострочный комментарий заключается между символами /* текст комментария */ . Он может размещаться на нескольких строках. Например:
#include /* Определение функции Main Выводит на консоль строку Hello World! */ int main() < std::coutКомпиляция
Создание исполняемого файла из исходного кода на C++ в общем случае состоит из трех этапов:
- Препроцессор обрабатывает все директивы препроцессора (например, директиву #include )
- Компилятор обрабатывает каждый файл с исходным кодом и создает из него объектный файл , который содержит машинный код. Например, код может разбросан по нескольким файлам с исходным кодом, и для каждого файла создается свой объектный файл
- Компоновщик (он же линкер/линковщик) объединяет все объектные файлы в единую программу. Данный процесс называется компоновкой/линковкой
Например, если у нас исходный код находится в трех файлах .cpp
Структура c что это за программа
Кроме классов для создания своих типов данных можно использовать структуры , которые унаследованы языком С++ от языка Си. Структура в C++ представляет собой производный тип данных, который представляет какую-то определенную сущность, также как и класс. Нередко структуры применителько к С++ также называют классами. И в реальности различия между ними не такие большие. Структура также может определять переменные, функции, конструкторы, деструкторы. Однако обычно структуры служат для хранения каких-то общедоступных данных в виде публичных переменных. Для остальных сценариев используются классы.
Для определения структуры применяется ключевое слово struct , а сам формат определения выглядит следующим образом:
struct имя_структуры < компоненты_структуры >;Имя_структуры представляет произвольный идентификатор, к которому применяются те же правила, что и при наименовании переменных. После имени структуры в фигурных скобках помещаются компоненты структуры - переменные и функции.
Например, определим простейшую структуру:
#include struct person < unsigned age; std::string name; >; int main()
Здесь определена структура person , которая имеет две переменных: name (представляет тип string) и age (представляет тип unsigned).
После определения структуры мы можем ее использовать. Для начала мы можем определить объект структуры - по сути обычную переменную, которая будет представлять выше созданный тип. Также после создания переменной структуры можно обращаться к ее элементам - получать их значения или, наоборот, присваивать им новые значения. Для обращения к элементам структуры используется операция "точка":
имя_переменной_структуры.имя_элементаПо сути структура похожа на класс, то есть с помощью структур также можно определять сущности для использования в программе. В то же время все члены структуры, для которых не используется спецификатор доступа (public, private), по умолчанию являются открытыми (public). Тогда как в классе все его члены, для которых не указан спецификатор доступа, являются закрытыми (private).
Кроме того мы можем инициализировать структуру, присвоив ее переменным значения с помощью синтаксиса инициализации:
person tom< 34, "Tom" >;Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры по порядку. Так как в структуре person первым определено свойство, которое представляет тип unsigned - число, то в фигурных скобках вначале идет число. И так далее для всех элементов структуры по порядку.
При этом любой класс мы можем представить в виде структуры и наоборот. Возьмем, к примеру, следующий класс:
#include class Person < public: Person(std::string name, unsigned age): name, age < >void print() < std::cout private: std::string name; unsigned age; >; int main() < Person bob; bob.print(); >Данный класс определяет сущность человека и содержит ряд приватных и публичных переменных и функции. Вместо класса для определения той же сущности мы могли бы использовать структуру:
#include struct person < public: person(std::string name, unsigned age): name, age < >void print() < std::cout private: std::string name; unsigned age; >; int main() < person bob; bob.print(); >И в плане конечного результата программы мы не увидели бы никакой разницы.
Когда использовать структуры? Как правило, структуры используются для описания таких данных, которые имеют только набор публичных атрибутов - открытых переменных. Например, как та же структура person, которая была определена в начале статьи. Иногда подобные сущности еще называют аггрегатными классами (aggregate classes).
Структуры
Структура в языке программирования Си представляет собой составной тип данных, который состоит из других компонентов. При этом в отличие от массива эти компоненты могут представлять различные типы данных.
Определение структуры
Для определения структуры применяется ключевое слово struct , а сам формат определения выглядит следующим образом:
struct имя_структуры < компоненты_структуры >;Имя_структуры представляет произвольный идентификатор, к которому применяются те же правила, что и при наименовании переменных.
После имени структуры в фигурных скобках помещаются компоненты структуры - объекты, которые составляют структуру.
Следует отметить, что в отличие от функции при определении структуры после закрывающей фигурной скобки идет точка с запятой.
Например, определим простейшую структуру:
struct person < int age; char * name; >;Здесь определена структура person , которая имеет два элемента: age (представляет тип int ) и name (представляет указатель на тип char ).
Все элементы структуры объявляются как обычные переменные. Но в отличие от переменных при определении элементов структуры для них не выделяется память, и их нельзя инициализировать. По сути мы просто определяем новый тип данных.
Использование структуры
После определения структуры мы можем ее использовать. Для начала мы можем определить объект структуры - по сути обычную переменную, которая будет представлять выше созданный тип:
// определение структуры person struct person < int age; char * name; >; int main(void) < // определение переменной, которая представляет структуру person struct person tom; >Здесь определена переменная tom, которая представляет структуру person . И при каждом определении переменной типа структуры ей будет выделяться память, необходимая для хранения ее элементов.
Инициализация структуры
При определении переменной структуры ее можно сразу инициализировать, присвоив какое-нибудь значение. Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры. Есть два способа инициализации структуры.
-
По позиции : значения передаются элементам структуры в том порядке, в котором они следуют в структуре:
struct person tom = ;
struct person tom = ;
Обращение к элементам структуры
Также после создания переменной структуры можно обращаться к ее элементам - получать их значения или, наоборот, присваивать им новые значения. Для обращения к элементам структуры используется операция "точка":
имя_переменной_структуры.имя_элемента
Теперь объединим все вместе в рамках программы:
#include struct person < int age; char * name; >; int main(void) < struct person tom = ; printf("Age: %d \t Name: %s", tom.age, tom.name); return 0; >
Консольный вывод программы:
Age: 23 Name: Tom
Можно инициализировать элементы структуры по отдельности:
#include struct person < int age; char * name; >; int main(void)
Объединение определение структуры и ее переменных.
Мы можем одновременно совмещать определение типа структуры и ее переменных:
#include struct person < int age; char * name; >tom; // определение структуры и ее переменной int main(void) < tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
После определения структуры, но до точки с запятой мы можем указать переменные этой структуры. А затем присвоить их элементам значения.
Можно тут же инициализировать структуру:
#include struct person < int age; char * name; >tom = ; int main(void)
Можно определить сразу несколько переменных:
struct person < int age; char * name; >tom, bob, alice;
При подобном определении мы можем даже не указывать имя структуры:
struct < int age; char * name; >tom;
В этом случае компилятор все равно будет знать, что переменная tom представляет структуры с двумя элементами name и age. И соответственно мы также с этими переменными сможем работать. Другое дело, что мы не сможем задать новые переменные этой структуры в других местах программы.
typedef
Еще один способ определения структуры представляет ключевое слово typedef :
#include typedef struct < int age; char * name; >person; int main(void) < person tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
В конце определения структуры после закрывающей фигурной скобки идет ее обозначение - в данном случае person . В дальнейшем мы можем использовать это обозначение для создания переменной структуры. При этом в отличие от примеров выше здесь при определении переменной не надо использовать слово struct .
Директива define
Еще один способ определить структуру представляет применение препроцессорной директивы #define :
#include #define PERSON struct int main(void) < PERSON tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
В данном случае директива define определяет константу PERSON, вместо которой при обработке исходного кода препроцессором будет вставляться код структуры struct
Копирование структур
Одну структуру можно присвавивать другой структуре того же типа. При копировании элементы структуры получают копии значений:
#include struct person < int age; char * name; >; int main(void) < struct person tom = ; // копируем значения из структуры tom в структуру bob struct person bob = tom; bob.name = "Bob"; printf("Name: %s \t Age: %d \n", bob.name, bob.age); printf("Name: %s \t Age: %d \n", tom.name, tom.age); return 0; >
Здесь в переменную bob копируются данные из структуры tom . Далее мы для структуры bob меняется значение поля name . В итоге мы получим следующий консольный вывод:
Name: Bob Age: 38 Name: Tom Age: 38
Ввод с консоли данных для структуры
С элементами структуры можно производить все те же операции, что и с переменными тех же типов. Например, добавим ввод с консоли:
#include struct person < int age; char name[20]; >; int main(void) < struct person tom = ; printf("Enter name: "); scanf("%s", tom.name); printf("Enter age: "); scanf("%d", &tom.age); printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
Консольный вывод программы:
Enter name: Eugene Enter age: 33 Name: Eugene Age: 33
При подготовке материала использовались источники:
https://metanit.com/cpp/tutorial/2.1.php
https://metanit.com/cpp/tutorial/5.8.php
https://metanit.com/c/tutorial/6.1.php