Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
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. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Christine26 июнь 01:23 Сначала было тежеловта читать, но потом всё изменилось, я с удовольствием прочитала, спасибо за книгу. Я прочитала весь цикл... Опасное влечение - Полина Лоранс
-
Тамаринда21 июнь 12:33 Редко что-то цепляет, но тут было всё живое, жизненное, чувственное, сильное, читайте, не пожалеете о своём времени...... Хрупкая связь - Ольга Джокер
-
Гость Марина20 июнь 06:08 Книга очень понравилась, хотя и длинная. Героиня сильная личность. Да и герой не подкачал. ... Странная - Татьяна Александровна Шумкова