Более подробная информация о константных функциях-членах изложена в разделе 9.7.4.
A.12.1.2. Друзья
Функция, не являющаяся членом класса, может получить доступ ко всем членам класса, если ее объявить с помощью ключевого слова
friend
. Рассмотрим пример.
// требует доступа к членам классов Matrix и Vector members:
Vector operator*(const Matrix&, const Vector&);
class Vector {
friend
Vector operator*(const Matrix&, const Vector&); // есть доступ
// ...
};
class Matrix {
friend
Vector operator*(const Matrix&, const Vector&); // есть доступ
// ...
};
Как показано выше, обычно это относится к функциям, которым нужен доступ к двум классам. Другое предназначение ключевого слова
friend
— обеспечивать функцию доступа, которую нельзя вызывать как функцию-член.
class Iter {
public:
int distance_to(const iter& a) const;
friend int difference(const Iter& a, const Iter& b);
// ...
};
void f(Iter& p, Iter& q)
{
int x = p.distance_to(q); //
вызов функции-члена
int y = difference(p,q); // вызов с помощью математического
// синтаксиса
// ...
}
Отметим, что функцию, объявленную с помощью ключевого слова
friend
, нельзя объявлять виртуальной.
A.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 int
) представляют собой особый случай. Они просто определяют символические целочисленные константы и не находятся в памяти, занимаемой объектом. Нестатические данные-члены не требуют отдельного определения, не могут быть определены отдельно и инициализироваться в классе.
struct 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; // ошибка: нестатические члены класса нельзя
// определять вне класса
Если вам необходимо инициализировать не статические и не константные данные-члены, используйте конструкторы.
Функции-члены не занимают память, выделенную для объекта.