Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / Указатель this.doc
Скачиваний:
106
Добавлен:
02.04.2015
Размер:
145.41 Кб
Скачать

Перегрузка операторов отношения и логических операторов

Пример:

Объявление функции в описании класса

Тело функции

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;

}

Наследование

  • Под наследованием понимают возможность объявления производных типов на основе ранее объявленных типов

  • Класс может быть порождён от одного или более классов (множественное наследование)

  • Производный класс наследует данные и функции своих базовых классов и добавляет или переопределяет собственные компоненты

  • В C++ количество непосредственных "предков" производного класса не ограничено

  • Наследуемые компоненты не перемещаются в производный класс, а остаются в базовом классе

Пример:

Дано: 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 позволяет создать член класса, который будет доступен в рамках данной иерархии классов, но закрыт для остальных элементов программы