- •Void Print();
- •Void print()
- •Void main()
- •Void print()
- •Void main()
- •Void main()
- •Void print()
- •Void main()
- •Void print()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void print();
- •Void Drob::print()
- •Void main()
- •Void main()
- •Void print();
- •Void Drob::print()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main ()
- •Void main ()
- •Void main ()
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();