Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
2
Добавлен:
14.07.2019
Размер:
399.36 Кб
Скачать

Void main()

{

f(3);

}

В данном случае при вызове функции произойдет неявное преобразование , то есть будет вызван конструктор с одним параметром , который преобразует значение типа int в объект Drob.

Пример 2.

drob f()

{

….

return 3;

}

Void main()

{

drob a;

a=f();

}

Здесь в операторе return компилятор также прибегнет к неявному преобразованию.

Для предотвращения неявных преобразований типов в таких ситуациях вместе с конструкторами преобразования используется ключевое слово explicit .

Explicit Drob(.)

{

……..

}

#include <iostream>

using namespace std;

class Drob

{

private:

int ch;

int zn;

public:

explicit Drob (int c=0, int z=1)

{

ch=c;

zn= z==0 ? 1 : z;

}

void SetCh(int);

void SetZn(int);

int GetCh();

int GetZn();

int InputCh();

int InputZn();

Void print();

operator int()

{

return ch/zn;

}

operator double()

{

return ch/zn;

}

};

void Drob::SetCh(int c)

{

ch = c;

}

void Drob::SetZn(int z)

{

if(z == 0)

{

cout<<"Error!!!!!\n";

zn = 1;

}

else

zn = z;

}

int Drob::GetCh()

{

return ch;

}

int Drob::GetZn()

{

return zn;

}

int Drob::InputCh()

{

cout<<"Vedite chislitel' - ";

cin>>ch;

return ch;

}

int Drob::InputZn()

{

cout<<"Vedite znamenatel' - ";

cin>>zn;

if (zn == 0)

{

cout<<"V znamenatetle ne mojet but' nol'!"<<endl;

zn = 1;

}

return zn;

}

Void Drob::print()

{

cout<< ch << "/" << zn << "\n";

}

Drob f()

{

return 3;

}

Void main()

{

Drob a;

a=f();

a.print();

}

ОПЕРАТОР ПЕРЕГРУЗКИ ПРИСВАИВАНИЯ

If(this==&obj) – проверка

ПЕРЕГРУЗКА ОПЕРАЦИИ ИНДЕКСАЦИИ

[ ] – операция индексации .

Синтаксис

Тип оператор [ ] (size_t index)

{

тело

}

Синтаксис 2(по ссылке )

Тип & оператор [ ] (size_t index)

{

тело

}

Перегружать операции индексации можно только в виде метода класса .

Class Vector

{

Int *p;

Size_t size;

Public:

……..

Int &operator[](size_t index)

{

Return p[index];

}

};

Так как мы сами перегружаем оператор [] , то внутри мы можем сделать проверку на выход индекса за границы массива.

ПЕРЕГРУЗКА ОПЕРАЦИИ ВЫЗОВА ФУНКЦИИ!

Тип возвращаемого значения operator() (параметры)

{

Тело;

}

#include<iostream>

using namespace std;

class Time

{

int hour;

int minute;

int second;

public:

Time()

{

hour=0;

minute=0;

second=0;

}

void vvod()

{

cout<<"Vvedite Bpem9! "<<endl;

cout<<endl;

cout<<"Hour : "<<endl;

cin>>hour;

cout<<"Minute : "<<endl;

cin>>minute;

cout<<"Second : "<<endl;

cin>>second;

}

void vivod()

{

cout<<hour;

cout<<":"<<minute;

cout<<":"<<second<<endl;

}

Time operator++()

{

second++;

if(second==60)

{

second=0;

minute++;

}

else if(minute==60)

{

minute=0;

hour++;

}

else if(hour==24)

{

hour=0;

}

return*this;

}

};

Void main()

{

Time t;

cout<<"Vvedite kol-vo sek posle kotorih tsikl zavershit svoe deistvie = ";

int n=0;

cin>>n;

t.vvod();

t.vivod();

for(int i=0;i<n;i++)

{

t++;

t.vivod();

}

}

ДРУЖЕСТВЕННЫЕ ФУНКЦИИ

Дружественные функции – это функции , которым дается доступ к скрытым полям и методам класса .

Class MyClass

{

….

Public:

….

Friend void F();

};

Void F()

{

….

}

#include<iostream>

using namespace std;

class Drob

{

int ch;

int zn;

public:

friend Drob operator+(const Drob&d1,const Drob&d2);

};

Drob operator+(const Drob&d1,const Drob&d2)

{

Drob rez;

rez.ch=d1.ch*d2.zn+d1.zn*d2.ch;

rez.zn=d1.zn*d2.zn;

return rez;

}

Существует возможность поместить определение дружественной функции непосредственно в объявление класса .

#include<iostream>

using namespace std;

class Drob

{

int ch;

int zn;

public:

friend Drob operator+(const Drob&d1,const Drob&d2);

{

Drob rez;

rez.ch=d1.ch*d2.zn+d1.zn*d2.ch;

rez.zn=d1.zn*d2.zn;

return rez;

}

};

В этом примере благодаря ключевому слову friend дружественная функция будет не методом класса , а обычной функцией .Одна функция может быть другом нескольких классов .

Class B;\\ предварительно объявление класса

Class A

{

Public:

Friend void F(A a ,B b);

};

Class B

{

Public:

Friend void F(A a , B b);

};

Void F(A a, B b)

{

}

Также дружественными можно сделать и методы других классов .

Class MyClass1

{

Public:

Friend void MyClass2::F();

};

ДРУЖЕСТВЕННЫЙ КЛАСС

Если необходимо нескольким методам одного класса , а иногда и всем , дать доступ к скрытым полям другого класса , то имеет смысл объявить другом весь класс целиком .

Class A

{

};

Class B

{

Friend class A;

};

ПЕРЕГРУЗКА ВВОДА И ВЫВОДА

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

Drob d;

Cin>>d;

Cout<<d;

Cin и cout – это объекты классов istream и ostream соответственно. И это позволяет нам перегрузить операции побитового сдвига для операндов одного из этих классов и нашего пользовательского типа .

Синтаксис :

Istream& operator>>(istream & is, MyClass & obj)

{

тело

}

Ostream& operator<<(ostream& os,MyClass & obj)

{

тело

}

#include <iostream>

using namespace std;

class Drob

{

private:

int ch;

int zn;

public:

void SetCh(int);

void SetZn(int);

int GetCh();

int GetZn();

int InputCh();

int InputZn();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]