2.x – Резюме к главе 2 и небольшой тест

Добавлено 16 апреля 2021 в 19:36

Краткое резюме

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

Вызов функции – это выражение, которое сообщает процессору выполнить функцию. Функция, инициирующая вызов функции, является вызывающей или caller, а вызываемая функцияcallee. Не забывайте добавлять круглые скобки при вызове функции.

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

Тип возвращаемого значения функции указывает тип значения, которое функция вернет. Инструкция return определяет конкретное возвращаемое значение, которое возвращается вызывающей стороне. Этот процесс называется возвратом по значению. Функции могут иметь тип возвращаемого значения void, если они не возвращают значение вызывающей стороне. Невозможность вернуть значение из не-void функции приведет к неопределенному поведению.

Значение, возвращаемое функцией main, называется кодом состояния, оно сообщает операционной системе (и любым другим программам, которые вызвали вашу), успешно ли выполнилась ваша программа. По общему соглашению, возвращаемое значение 0 означает успех, а положительное возвращаемое значение означает неудачу.

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

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

Параметры функции и переменные, определенные внутри тела функции, называются локальными переменными. Время, в течение которого существует переменная, называется ее временем жизни. Переменные создаются и уничтожаются во время выполнения (runtime), то есть во время работы программы. Область видимости переменной определяет, где к ней можно получить доступ. Когда к переменной можно получить доступ, мы говорим, что она находится в области видимости. Когда к ней невозможно получить доступ, мы говорим, что она находится вне области видимости. Область видимости – это свойство времени компиляции, то есть она применяется во время компиляции.

Рефакторинг – это процесс разбиения более крупной функции на множество более мелких и простых функций.

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

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

Определение фактически реализует (для функций и типов) или создает (для переменных) идентификатор. Объявление – это инструкция, которая сообщает компилятору о существовании идентификатора. В C++ все определения служат объявлениями. Чистые объявления – это объявления, которые не являются также определениями (например, прототипы функций).

Большинство нетривиальных программ содержат несколько файлов.

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

Препроцессор – это процесс, который выполняется над кодом перед его компиляцией. Директивы – это специальные инструкции для препроцессора. Директивы начинаются с символа # и заканчиваются символом новой строки. Макрос – это правило, определяющее, как входной текст преобразуется в заменяющий его выходной текст.

Заголовочные файлы – это файлы, предназначенные для распространения объявлений в файлы исходного кода. При использовании директивы #include данная директива заменяется содержимым включаемого файла. При включении системных заголовков (например, из стандартной библиотеки C++) используйте угловые скобки, а при включении пользовательских заголовков (тех, которые пишете вы) используйте двойные кавычки. При включении системных заголовков включайте версии без расширения .h, если они существуют.

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

Небольшой тест

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


Вопрос 1

Напишите программу в одном исходном файле (с именем main.cpp), которая считывает два отдельных целых числа, вводимых пользователем, складывает их вместе и затем выводит ответ. Программа должна использовать три функции:

  • Функция с именем readNumber должна использоваться для получения от пользователя (и возврата) одного целого числа.
  • Для вывода ответа следует использовать функцию с именем writeAnswer. Эта функция должна принимать единственный параметр и не иметь возвращаемого значения.
  • Для «склеивания» указанных выше функций следует использовать функцию main().

Вам не нужно писать отдельную функцию для сложения (просто используйте operator+ напрямую).

Вам нужно будет дважды вызвать readNumber().

main.cpp:

#include <iostream>
 
int readNumber()
{
    std::cout << "Enter a number: ";
    int x {};
    std::cin >> x;
    return x;
}
 
void writeAnswer(int x)
{
    std::cout << "The answer is " << x << '\n';
}
 
int main()
{
    int x { readNumber() };
    int y { readNumber() };
    writeAnswer(x + y); // использование operator+, чтобы передать сумму x и y в writeAnswer()
    return 0;
}

Вопрос 2

Измените программу, которую вы написали в ответе на вопрос 1, чтобы readNumber() и writeAnswer() находились в отдельном файле с именем io.cpp. Для доступа к ним из main() используйте предварительное объявление.

Если у вас возникли проблемы, убедитесь, что io.cpp правильно добавлен в ваш проект, чтобы он компилировался.

io.cpp:

#include <iostream>
 
int readNumber()
{
    std::cout << "Enter a number: ";
    int x {};
    std::cin >> x;
    return x;
}
 
void writeAnswer(int x)
{
    std::cout << "The answer is " << x << '\n';
}

main.cpp:

// это предварительные объявления для функций в io.cpp
int readNumber();
void writeAnswer(int x);
 
int main()
{
    int x { readNumber() };
    int y { readNumber() };
    writeAnswer(x+y);
    return 0;
}

Вопрос 3

Измените программу, которую вы написали в ответе на вопрос 2, так, чтобы для доступа к функциям она использовала заголовочный файл (с именем io.h) вместо использования предварительных объявлений непосредственно в файлах исходного кода (.cpp). Убедитесь, что ваш заголовочный файл использует защиту заголовков.

io.h:

#ifndef IO_H
#define IO_H
 
int readNumber();
void writeAnswer(int x);
 
#endif

io.cpp:

#include "io.h"
#include <iostream>
 
int readNumber()
{
    std::cout << "Enter a number: ";
    int x {};
    std::cin >> x;
    return x;
}
 
void writeAnswer(int x)
{
    std::cout << "The answer is " << x << '\n';
}

main.cpp:

#include "io.h"
 
int main()
{
    int x { readNumber() };
    int y { readNumber() };
    writeAnswer(x+y);
    return 0;
}

Теги

C++ / CppLearnCppДля начинающихОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.