- •25. Понятие объекта и класса.
- •Определение методов класса
- •Переопределение операций
- •Подписи методов и необязательные аргументы
- •Запись классов
- •26. Скрытие данных и общий интерфейс.
- •27. Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- •Основное назначение конструкторов - инициализация объектов.
- •Использование конструкторов с аргументами по умолчанию
- •Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- •Использование деструкторов
- •Когда вызываются конструкторы и деструкторы.
- •28. Перегрузка классов.
- •Перегрузка операторов плюс и минус
- •Второй пример
- •Операторы, которые Вbl he можете перегрузить
- •29. Дружественные классы.
- •30. Наследование.
- •Внутреннее и защищенное наследование
- •Виртуальное наследование
- •31. Множественное наследование.
- •32. Полиморфизм.
- •33. Виртуальная функция.
- •34. Передача данных по умолчанию.
- •39. Создание и уничтожение динамических объектов.
- •40. Динамические библиотеки (dll).
Второй пример
При создании ваших собственных типов данных с помощью классов наиболее общей операцией будет проверка, являются ли два объекта одинаковыми. Используя перегрузку, ваши программы могут перегрузить операторы равенства (==), неравенства (!=) или другие операторы сравнения. Следующая программа COMP_STR.CPP добавляет новый оператор в класс string, который проверяет, равны ли два объекта string.Используя перегрузку операторов, ваши программы могут проверять, содержат ли строковые объекты одинаковые строки, как показано ниже:
if (some_string == another_string)
Ниже приведена реализация программы COMP_STR.CPP:
#include <iostream.h>
#include <string.h>
class string
{ public: string(char *); // конструктор char * operator +(char *); char * operator -(char); int operator ==(string); void show_string(void); private: char data[256]; };
string::string(char *str)
{ strcpy(data, str); }
char * string::operator +(char *str)
{ return(strcat(data, str)); }
char * string::operator -(char letter)
{ char temp[256]; int i, j; for (i = 0, j = 0; data[i]; i++) if (data[i] 1= letter) temp[j++] = data[i]; temp[j] = NULL; return(strcpy(data, temp)); }
int string::operator ==(string str)
{ int i; for (i = 0; data[i] == str.data[i]; i++) if ((data[i] == NULL) && (str.data[i] == NULL)) return(1); // Равно return (0); //He равно }
void string::show_string(void)
{ cout << data << endl; }
void main(void)
{ string title( "Учимся программировать на C++"); string lesson("Перегрузка операторов"); string str( "Учимся программировать на C++"); if (title == lesson) cout << "title и lesson равны" << endl; if (str == lesson) cout << "str и lesson равны" << endl; if (title == str) cout << "title и str равны" << endl; }
Как видите, перегружая операторы подобным образом, вы упрощаете понимание ваших программ.
Операторы, которые Вbl he можете перегрузить
В общем случае ваши программы могут перегрузить почти все операторы С++. В табл. 24 перечислены операторы, которые C++ не позволяет перегружать.
Таблица 24. Операторы C++, которые ваши программы не могут перегрузить.
Оператор
|
Назначение |
Пример |
. |
Выбор элемента |
object.member |
.* |
Указатель на элемент |
object.*member |
:: |
Разрешение области видимости |
classname::member |
?: |
Условный оператор сравнения |
с = (а > b) ? а : b; |
29. Дружественные классы.
Если все методы какого-либо класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным с помощью ключевого слова friend. В приведенном ниже примере класс mistress объявляется дружественным классу hero:
class hero{
... friend class mistress;}
class mistress{
... void f1();
void f1();}
Функции f1 и f2 являются дружественными по отношению к классу hero (хотя и описаны без ключевого слова friend) и имеют доступ ко всем его полям.
Объявление friend не является спецификатором доступа и не наследуется. Обратите внимание на то, что класс сам определяет, какие функции и классы являются дружественными, а какие нет.
Объявление дружественного класса позволяет всем его методам получить доступ ко всем переменным и методам другого класса.
Например:
class A {public: int Fx();}
class B {public:
friend class A;
private:
}
Дружественный класс или член класса будет доступен только в том случае, если он был объявлен в области видимости самого класса или ранее во внешней области видимости, внутри которой располагается область видимости, содержащая объявление класса с объявлениями друзей класса.
Например:
class A {public:
// Класс расположен во внешней
// области видимости
int Fx1();
}
namespace classB {
class B {public:
friend class A;
friend class C;
private:
}
class C { public:
// Класс расположен в том же
// пространстве имен
int Fx2();
}
}
Дружественные классы не наследуются, и их дружественность не является транзитивной.
Например:
class A {int Fx();}
class B {friend class A;}
class C {friend class B;}
// Класс А не является
// дружественным классу C
class D : public B {}
// Класс А не является
// дружественным классу D