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

Перечислители и значения перечислений неявно преобразовываются в целые числа, но целые числа не преобразовываются в типы перечислений неявно.

int x = green;   // OK: неявное преобразование Color в int

Color c = green; // OK

c = 2;           // ошибка: нет неявного преобразования

                 // int в Color

c = Color(2);    // OK: (непроверяемое) явное преобразование

int y = c;       // OK: неявное преобразование Color в int

Использование перечислений обсуждается в разделе 9.5.

<p id="AutBody_Root612"><strong>A.12. Классы</strong></p>

Класс (class) — это тип, для которого пользователь определил представление его объектов и операции, допустимые для этих объектов.

class X {

public:

  // пользовательский интерфейс

private:

  // реализация

};

Переменные, функции и типы, определенные в объявлении класса, называются членами этого класса. Технические детали изложены в главе 9.

<p id="AutBody_Root613"><strong>A.12.1. Доступ к членам класса</strong></p>

Открытый член класса доступен для пользователей; закрытый член класса доступен только членам класса.

class Date {

public:

  // ...

  int next_day;

private:

  int y, m, d;

};

void Date::next_day { return d+1; } // OK

void f(Date d)

{

  int nd = d.d+1; // ошибка: Date::d — закрытый член класса

  // ...

}

Структура — это класс, члены которого по умолчанию являются открытыми.

struct S {

  // члены (открытые, если явно не объявлены закрытыми)

};

Более подробная информация о доступе к членам класса, включая обсуждение защищенных членов, приведена в разделе 14.3.4.

К членам объекта можно обращаться с помощью оператора . (точка), примененного к его имени, или оператора –> (стрелка), примененного к указателю на него.

struct Date {

 int d, m, y;

 int day const { return d; } // определенный в классе

 int month const;            // просто объявленный; определен

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

 int year const;             // просто объявленный; определен

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

};

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

  // ...

}

<p id="AutBody_Root614"><strong>A.12.1.1. Указатель this</strong></p>

Если хотите явно сослаться на объект, из которого вызвана функция-член, то можете использовать зарезервированный указатель 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.

<p id="AutBody_Root615"><strong>A.12.1.2. Друзья</strong></p>

Функция, не являющаяся членом класса, может получить доступ ко всем членам класса, если ее объявить с помощью ключевого слова friend. Рассмотрим пример.

// требует доступа к членам классов Matrix и Vector members:

Vector operator*(const Matrix&, const Vector&);

class Vector {

  friend

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT