Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

void f(Date d1, Date d2)

{

d1.day; // обращается к члену d1.d

d2.day; // обращается к члену d2.d

// ...

}

A.12.1.1. Указатель this

Если хотите явно сослаться на объект, из которого вызвана функция-член, то можете использовать зарезервированный указатель

this
.

struct Date {

int d, m, y;

int month const { return this–>m; }

// ...

};

Функция-член,

объявленная с помощью спецификатора
const
(константная функция-член), не может изменять значение члена объекта, из которого она вызвана.

struct Date {

int d, m, y;

int month const { ++m; } // ошибка: month — константная

// функция

// ...

};

Более подробная информация о константных функциях-членах изложена в разделе 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; // ошибка: нестатические члены класса нельзя

// определять вне класса

Если вам необходимо инициализировать не статические и не константные данные-члены, используйте конструкторы.

Функции-члены не занимают память, выделенную для объекта.

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9