Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Программа C++ состоит из различных сущностей, таких как переменные, функции, типы и пространства имен. Перед их использованием необходимо объявить каждую из этих сущностей. Объявление указывает уникальное имя сущности, а также сведения о его типе и других характеристиках. В C++ точка объявления имени — это точка, в которой она становится видимой компилятору. Вы не можете ссылаться на функцию или класс, объявленный в какой-то момент в единице компиляции. Переменные должны объявляться как можно ближе до точки, в которой они используются.
В следующем примере показаны некоторые объявления:
#include <string>
int f(int i); // forward declaration
int main()
{
const double pi = 3.14; //OK
int i = f(2); //OK. f is forward-declared
C obj; // error! C not yet declared.
std::string str; // OK std::string is declared in <string> header
j = 0; // error! No type specified.
auto k = 0; // OK. type inferred as int by compiler.
}
int f(int i)
{
return i + 42;
}
namespace N {
class C{/*...*/};
}
В строке 5 main функция объявляется. В строке 7 const переменная с именем pi объявлена и инициализирована. В строке 8 целое число i объявляется и инициализируется со значением, созданным функцией f. Имя f видно компилятору из-за объявления пересылки в строке 3.
В строке 9 объявлена переменная типа objC . Однако это объявление вызывает ошибку, так как C не объявляется до конца программы и не объявляется перенаправленным. Чтобы устранить ошибку, можно переместить все определениеC до main или добавить для него объявление вперед. Это поведение отличается от других языков, таких как C#. На этих языках функции и классы можно использовать до их точки объявления в исходном файле.
В строке 10 объявлена переменная типа strstd::string . Имя std::string видно, так как оно представлено в stringфайле заголовка, который объединяется в исходный файл в строке 1.
std — это пространство имен, в котором string объявлен класс.
В строке 11 возникает ошибка, так как имя j не было объявлено. Объявление должно предоставлять тип, в отличие от других языков, таких как JavaScript. В строке 12 auto используется ключевое слово, которое сообщает компилятору определить тип k на основе значения, с которым оно инициализировано. Компилятор в этом случае выбирает int тип.
Область видимости объявления
Имя, введенное объявлением, допустимо в области , в которой происходит объявление. В предыдущем примере переменные, объявленные внутри main функции, являются локальными переменными. Можно объявить другую переменную, именуемую i за пределами основной, в глобальной области, и она будет отдельной сущностью. Однако такое дублирование имен может привести к путанице и ошибкам программиста, и их следует избежать. В строке 21 класс C объявляется в области пространства Nимен. Использование пространств имен помогает избежать конфликтов имен. Большинство имен стандартной std библиотеки C++ объявляются в пространстве имен. Дополнительные сведения о взаимодействии правил области с объявлениями см. в разделе "Область".
Определения
Некоторые сущности, включая функции, классы, перечисления и постоянные переменные, должны быть определены, а также объявлены.
Определение предоставляет компилятору все сведения, необходимые для создания машинного кода при последующем использовании сущности в программе. В предыдущем примере строка 3 содержит объявление для функции f , но определение функции предоставляется в строках 15–18. В строке 21 класс объявлен и определен (хотя как определено, класс C ничего не делает). Константная переменная должна быть определена, другими словами, присвоено значение в той же инструкции, в которой она объявлена. Объявление встроенного типа, например автоматическое определение, так как int компилятор знает, сколько пространства для него выделяется.
В следующем примере показаны объявления, которые также являются определениями:
// Declare and define int variables i and j.
int i;
int j = 10;
// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };
// Declare class CheckBox.
class CheckBox : public Control
{
public:
Boolean IsChecked();
virtual int ChangeState() = 0;
};
Ниже приведены некоторые объявления, которые не являются определениями:
extern int i;
char *strchr( const char *Str, const char Target );
Операторы Typedefs и using
В более ранних версиях C++typedefключевое слово используется для объявления нового имени, которое является псевдонимомдругого имени. Например, тип std::string — это другое имя.std::basic_string<char> Очевидно, почему программисты используют имя typedef, а не фактическое имя. В современном C++ using ключевое слово предпочтительнее typedef, но идея аналогична: новое имя объявляется для сущности, которая уже объявлена и определена.
Статические члены класса
Элементы данных статического класса являются дискретными переменными, общими для всех объектов класса. Так как они совместно используются, они должны быть определены и инициализированы вне определения класса. Дополнительные сведения см. в разделе "Классы".
объявления экстернов
Программа C++ может содержать несколько единиц компиляции. Чтобы объявить сущность, определенную в отдельном модуле компиляции, используйте ключевое extern слово. Сведения в объявлении достаточно для компилятора. Однако если определение сущности не удается найти на шаге связывания, компоновщик вызовет ошибку.
В этом разделе
классы хранилищ;
const
constexpr
extern
Инициализаторы
Псевдонимы и определения типов
using декларация
volatile
decltype
Атрибуты в C++