Программирование. Принципы и практика использования C++ Исправленное издание, стр. 416
void f(Iter& p, Iter& q){ int x = p.distance_to(q); // вызов функции-члена int y = difference(p,q); // вызов с помощью математического // синтаксиса // ...}Отметим, что функцию, объявленную с помощью ключевого слова
friendA.12.2. Определения членов класса
Члены класса, являющиеся целочисленными константами, функциями или типами, могут быть определены как в классе, так и вне его.
struct S { static const int c = 1; static const int c2; void f() { } void f2(); struct SS { int a; }; struct SS2;};Члены, которые не были определены в классе, должны быть определены “где-то”.
const int S::c2 = 7;void S::f2() { }struct S::SS2 { int m; };Статические константные целочисленные члены класса (
static const intstruct X { int x; int y = 7; // ошибка: нестатические данные-члены // не могут инициализироваться внутри класса static int z = 7; // ошибка: данные-члены, не являющиеся // константами, не могут инициализироваться // внутри класса static const string ae = "7"; // ошибка: нецелочисленный тип // нельзя инициализировать // внутри класса static const int oe = 7; // OK: статический константный // целочисленный тип};int X::x = 7; // ошибка: нестатические члены класса нельзя // определять вне класса Если вам необходимо инициализировать не статические и не константные данные-члены, используйте конструкторы.
Функции-члены не занимают память, выделенную для объекта.
struct S { int m; void f();};Здесь
sizeof(S)==sizeof(int)A.12.3. Создание, уничтожение и копирование
Определить смысл инициализации объекта класса можно, определив один или несколько конструкторов (constructors). Конструктор — это функция-член, не имеющая возвращаемого значения, имя которой совпадает с именем класса.
class Date {public: Date(int yy,int mm,int dd):y(yy),m(mm),d(dd) { } // ...private: int y,m,d;};Date d1(2006,11,15); // OK: инициализация с помощью конструктораDate d2; // ошибка: нет инициализацииDate d3(11,15); // ошибка: неправильная инициализация // (требуются три инициализатора)Обратите внимание на то, что данные-члены могут быть инициализированы с помощью списка инициализации в конструкторе. Члены класса инициализируются в порядке их определения в классе.
Конструкторы обычно используются для установления инвариантов класса и получения ресурсов (см. разделы 9.4.2 и 9.4.3).
Объекты класса создаются снизу вверх, начиная с объектов базового класса (см. раздел 14.3.1) в порядке их объявления. Затем в порядке объявления создаются члены класса, после чего следует код самого конструктора. Если программист не сделает чего-нибудь очень странного, это гарантирует, что каждый объект класса будет создан до своего использования.
Если конструктор с одним аргументом не объявлен с помощью ключевого слова
explicitclass Date {public: Date(string); explicit Date(long); // используется целочисленное // представление даты // ...};void f(Date);Date d1 = "June 5, 1848"; // OKf("June 5, 1848"); // OKDate d2 = 2007*12*31+6*31+5; // ошибка: Date(long) — явный // конструкторf(2007*12*31+6*31+5); // ошибка: Date(long) — явный конструкторDate d3(2007*12*31+6*31+5); // OK