Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ | страница 10



Кстати, size_t – это всего-навсего определенный директивой typedef синоним для некоторых беззнаковых типов, которые в C++ используются для разного рода счетчиков (например, количества символов в строках типа char*, количества элементов в контейнерах STL и т. п.). Это также тип, принимаемый функциями operator[] в векторах (vector), деках (deque) и строках (string). Этому соглашению мы будем следовать и при определении наших собственных функций operator[] в правиле 3.

В любом объявлении функции указывается ее сигнатура, то есть типы параметров и возвращаемого значения. Можно сказать, что сигнатура функции – это ее тип. Так, сигнатурой функции numDigits является std::size_t(int), иными словами, это «функция, принимающая int и возвращающая std::size_t». Официальное определение «сигнатуры» в C++ не включает тип возвращаемого функцией значения, но в этой книге нам будет удобно считать, что он все же является частью сигнатуры.

Определение (definition) сообщает компилятору детали, которые опущены в объявлении. Для объекта определение – это то место, где компилятор выделяет для него память. Для функции или шаблона функции определение содержит тело функции. В определении класса или шаблона класса перечисляются его члены:


>int x; // определение объекта

>std::size_t numDigits(int number) // определение функции

>{ // (эта функция возвращает количество

>std::size_t digitsSoFar = 1; // десятичных знаков в своем параметре)

>while((number /= 10) != 0) ++digitsSoFar;

>return digitsSoFar;

>}

>class Widget { // определение класса

>public:

>Widget();

>~Widget();

>...

>};

>template // определение шаблона

>class GraphNode {

>public:

>GraphNode();

>~GraphNode();

>...

>};


Инициализация (initialization) – это процесс присваивания объекту начального значения. Для объектов пользовательских типов инициализация выполняется конструкторами. Конструктор по умолчанию (default constructor) – это конструктор, который может быть вызван без аргументов. Такой конструктор либо не имеет параметров вовсе, либо имеет значение по умолчанию для каждого параметра:


>class A {

>public:

>A(); // конструктор по умолчанию

>};

>class B {

>public:

>explicit B(int x = 0; bool b = true); // конструктор по умолчанию,

>}; // см. далее объяснение

>// ключевого слова “explicit”

>class C {

public:

>explicit C(int x); // это не конструктор по

>>// умолчанию

>};


Конструкторы классов B и C объявлены в ключевым словом explicit (явный). Это предотвращает их использование для неявных преобразований типов, хотя не запрещает применения, если преобразование указано явно: