Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

// в другом месте

};

Date x;

x.d = 15; // доступ через переменную

int y = x.day; // вызов через переменную

Date* p = &x;

p–>m = 7; // доступ через указатель

int z = p–>month; // вызов через указатель

На члены класса можно ссылаться с помощью оператора

::
(разрешение области видимости).

int Date::year const { return y; } // определение за пределами

// класса

В функциях-членах класса можно ссылаться на другие члены класса, не указывая имя класса.

struct Date {

int d, m, y;

int day const { return d; }

// ...

};

Такие имена относятся к объекту, из которого вызвана функция:

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
, нельзя объявлять виртуальной.

  • Читать дальше
  • 1
  • ...
  • 477
  • 478
  • 479
  • 480
  • 481
  • 482
  • 483
  • 484
  • 485
  • 486
  • 487
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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