Характеристики объектно-ориентированных языков. Конструкторы и деструкторы. Дружественные функции, страница 2

#include <iostream.h>

#include <conio.h>

class queue {

int q[10];

int sloc,rloc;

public:

void init(void);

void qput(int i);

int qget(void);

};

//описание функций членов класса

void queue::init(void)

{

rloc=sloc=0;

}

int queue::qget(void)

{

if(sloc==rloc){

cout<<"очередь пуста\n";

return 0;

}

return q[rloc++];

}

void queue::qput(int i)

{

if(sloc==10){

cout<<"очередьполна\n";

return;

}

q[sloc++]=i;

}

 

main(void)

{

queue a,b; //созданы 2 объекта

a.init();

b.init();

//заполнение очереди а

a.qput(7);

a.qput(9);

a.qput(11);

a.qput(21);

//заполнение очереди b квадратами

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

b.qput(i*i);

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<a.qget()<<"\n "<<"теперь в\n";

for(i=0;i<12;i++)

cout<<b.qget()<<" ";

getch();

return 0;

}

 
 


Одним из путей реализации полиморфизма является перегрузка функций. Две и более функции могут иметь одно и то же имя, но отличаться друг от друга количеством или типом параметров. Например, нижеприведенная функция позволяет возводить в квадрат переменные разных типов:

#include <iostream.h>

int sqr_it (int i);

double sqr_it (double d);

long sqr_it (long l);

main(void)

{

  int  i=7;  double d=2.3;  long l=20;

cout<< sqr_it ( i ) <<"\n ";

cout<< sqr_it ( d ) <<"\n ";

cout<< sqr_it ( l ) <<"\n ";

cout<< sqr_it (10) <<"\n ";

cout<< sqr_it (10.1) <<"\n ";

cout<< sqr_it (70000) <<"\n " ;

return 0;

}

int sqr_it (int i){

cout<< "целый аргумент \n ";

return i*i;

}

double  sqr_it (double d){

cout<< "вещественный  аргумент \n ";

return d*d;

}

long sqr_it (long l)

{

cout<< "аргументтипа long\n ";

return l*l;

}

 

Перегружаемые функции

int sqr_it (int i);

double sqr_it (double d);

long sqr_it (long l);

 отличаются типом возвращаемого значения и типом аргумента. Полиморфизм реализуется также перегрузкой операций. Например, операции << и >> имеют двоякий смысл: поразрядный сдвиг и оператор ввода/ вывода на консоль.

 
 


Наследование  позволяет объединять один класс с другим. В нашем примере с очередью добавим еще одну функцию, позволяющую находить сумму элементов очереди. В этом случае можно переписать класс queue или построить новый класс queue1 на основе уже имеющегося класса с помощью механизма наследования. Рассмотрим второй вариант.

//использование наследования классов

//добавим функцию вычисления суммы чисел

//в очереди и вывод этой суммы

#include <iostream.h>

#include <conio.h>

class queue {  //объявляем класс

protected:

int q[10];

int sloc,rloc;

public:

void init(void);

void qput(int i);

int qget(void);

};

class queue1:public queue {  //объявляемкласс queue1

int sum;   //функции этого класса не имеют доступа к приватной части класса queue

public:

int get_sum(void);          //подсчетсуммы

void show_sum(void);        //выводсуммы

};

//описание функций членов класса

void queue::init(void)

{

rloc=sloc=0;

}

int queue::qget(void)

{

if(sloc==rloc){

cout<<"очередь пуста\n";

return 0;

}

return q[rloc++];

}

 

void queue::qput(int i)

{

if(sloc==10){

cout<<"очередьполна\n";

return;

}

q[sloc++]=i;

}

// описание функций членов класса queue1

int queue1::get_sum(void)

{

sum=0;

for(int i=rloc;i<sloc;i++)

sum+=q[i];

return sum;

}

void queue1::show_sum(void)

{

cout<<"сумма очереди -"<< sum<<"\n";

}

main(void)

{

queue1 ob; //созданы 2 объекта

ob.init();

for(int i=0;i<5;i++){

ob.qput(100+i);

ob.get_sum();

ob.show_sum();

}

for(i=0;i<6;i++){

ob.get_sum();

ob.show_sum();

ob.qget();

}

return 0;

}