
- •Конструкторы копии и параметры функции
- •Указатель this
- •Встраиваемые (inline-функции)
- •Функции-друзья (friend)
- •Перегрузка операторов с использованием функций-членов класса
- •Перегрузка операторов отношения и логических операторов
- •Перегрузка операторов ввода-вывода
- •Основная форма наследования
- •Множественное наследование
- •Передача параметров конструкторам базового класса
- •Виртуальные базовые классы
- •Виртуальные функции
Перегрузка операторов отношения и логических операторов
Пример:
Объявление функции в описании класса |
Тело функции |
bool operator= =(vector op2) |
bool vector::operator= =(vector op2) { if ((x==op2.x) && (y==op2.y)) return true; else return false; } |
Фрагмент кода vector a,b; //объекты типа vector if (a= =b) cout<<”Вектор a равен вектору b\n”; else cout << <<”Вектор a не равен вектору b\n”; //Так как операторная функция operator= =( ) возвращает результат типа bool, ее можно использовать в инструкции if |
Перегрузка операторов ввода-вывода
Пусть есть класс:
class three_d
{
int x,y,z;
public:
three_d(int a, int b, int c) {x=a; y=b; y=c;}
// место для вставки операторных функций ввода-вывода
};
Вывод данных : ostream &operator<<(ostream &stream, class_type obj) { // код, относящийся к классу типа class_type return stream; } Ввод данных: istream &operator>>(istream &stream, class_type &obj) { // код ввода, относящийся к классу типа class_type return stream; }
// stream – имя потока – может быть произвольным |
|
Добавим в раздел public:
friend ostream &operator<<(ostream &stream, three_d obj);
friend istream &operator>>(istream &stream, three_d &obj);
ostream &operator<<(ostream &stream, three_d obj)
{
stream<<obj.x<<”, “;
stream<<obj.y<<”, “;
stream<<obj.z<<endl;
return stream;
}
istream &operator>>(istream &stream, three_d &obj)
{
cout<<”Введите координаты X, Y, Z: ”;
stream>>obj.x>>obj.y>>obj.z;
return stream;
}
int main( )
{
three_d a(1,2,3); //конструктор с параметром
cout<< a; // вывод объекта
cin>>a; // ввод объекта
cout<<a; // вывод объекта
return 0;
}
Наследование
|
Пример:
Дано: 3 класса A, B, C.
Класс C наследует свойства класса B
Класс B наследует свойства класса А
Все члены классов объявлены со спецификатором public
A |
B |
C | |
class A { public: A( ){cout <<”A”<<endl;}; ~A( ){ cout <<”noA”<<endl; }; int x0; int f0 () {return 1;}; }; |
class B : public A { public: B( ){ cout <<”B”<<endl ;}; ~B( ){cout <<”noB”<<endl; }; int x1; int x2; int xx; int f1 () {return 100;}; int f2 () {return 200;}; }; |
class С : public B { public: C( ){cout <<”C”<<endl; }; ~C( ){cout <<”noC”<<endl; }; int x3; int f1 () {return 1000;}; int f3 () {return 3000;}; };
| |
|
|
| |
void main () {C MyObject; } |
Объект-представитель класса C является единым блоком объектов и включает собственные данные-члены класса C, а также данные-члены классов B и A. | ||
Выполнение программы | |||
A B C noC noB noA |
Вызов конструктора класса А Вызов конструктора класса B Вызов конструктора класса C Вызов деструктора класса C Вызов деструктора класса B Вызов деструктора класса A | ||
|
Пример 2
Базовый класс |
Производный класс |
|
class X{ int i; int j; public: void get_ij(); void put_ij(); }; |
class Y:public X{ int k; public: int get_k(); void put_k(); }; |
Функции-члены класса Y могут использовать функции get_ij() и put_ij(), но не имеют доступа к i и j класса X. |
class X{ protected: int i; int j; public: void get_ij(); void put_ij(); }; |
class Y:public X{ int k; public: int get_k(); void put_k(){k=i*i;} }; |
Члены класса Y имеют доступ к i и j класса X |
Спецификатор protected позволяет создать член класса, который будет доступен в рамках данной иерархии классов, но закрыт для остальных элементов программы |