KnigkinDom.org» » »📕 Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 312 313 314 315 316 317 318 319 320 ... 337
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
пользователем (перегруженного оператора), состоит из символа оператора, которому предшествует ключевое слово operator; например, имя функции, определяющей оператор +, выглядит как operator +.

Matrix operator+(const Matrix&, const Matrix&);

Примеры можно найти в определениях классов std::ostream (см. главы 10-11), std::vector (см. главы 17–19 и раздел Б.4), std::complex (см. раздел Б.9.3) и Matrix (см. главу 24).

Перегрузить можно все операторы за исключением следующих:

?: . .* :: sizeof typeid

Функции, определяющие следующие операторы, должны быть членами класса:

= [ ] ( ) –>

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

Обратите внимание на то, что каждый пользовательский тип имеет оператор = (присваивание и инициализация), & (взятие адреса) и , (запятая), определенные по умолчанию.

При перегрузке операторов следует проявлять умеренность и придерживаться общепринятых соглашений.

A.11. Перечисления

Перечисление (enumeration) определяет тип, содержащий набор именованных значения (перечислителей).

enum Color { green, yellow, red };

По умолчанию первый перечислитель равен нулю 0, так что green==0, а остальные значения увеличиваются на единицу, так что yellow==1 и red==2. Кроме того, можно явно определить значение перечислителя.

enum Day { Monday=1,Tuesday,Wednesday };

Итак, Monday==1, Tuesday==2 и Wednesday==3.

Отметим, что перечислители принадлежат не области видимости своего перечисления, а охватывающей области видимости.

int x = green;        // OK

int y = Color::green; // ошибка

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

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.

A.12. Классы

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

class X {

public:

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

private:

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

};

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

A.12.1. Доступ к членам класса

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

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

  // ...

}

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&

1 ... 312 313 314 315 316 317 318 319 320 ... 337
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Christine Christine26 июнь 01:23 ​​​​Сначала было тежеловта читать, но потом всё изменилось, я с удовольствием прочитала, спасибо за книгу. Я прочитала весь цикл... Опасное влечение - Полина Лоранс
  2. Тамаринда Тамаринда21 июнь 12:33 Редко что-то цепляет, но тут было всё живое, жизненное, чувственное, сильное, читайте, не пожалеете о своём времени...... Хрупкая связь - Ольга Джокер
  3. Гость Марина Гость Марина20 июнь 06:08 Книга очень понравилась, хотя и длинная. Героиня сильная личность. Да и герой не подкачал. ... Странная - Татьяна Александровна Шумкова
Все комметарии
Новое в блоге