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

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

Жанры

Программирование. Принципы и практика использования 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; // ошибка: нестатические члены класса нельзя

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

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

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

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

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Дворянская кровь

Седой Василий
1. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Дворянская кровь

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Вопреки судьбе, или В другой мир за счастьем

Цвик Катерина Александровна
Любовные романы:
любовно-фантастические романы
6.46
рейтинг книги
Вопреки судьбе, или В другой мир за счастьем

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Право налево

Зика Натаэль
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Право налево

Шведский стол

Ланцов Михаил Алексеевич
3. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Шведский стол

(не)Бальмануг. Дочь 2

Лашина Полина
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг. Дочь 2

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

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

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

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3