Эффективное использование 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 (явный). Это предотвращает их использование для неявных преобразований типов, хотя не запрещает применения, если преобразование указано явно: