Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
63
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать
}
Результат работы программы:
Введите первую строку (не более 80 символов) : overload
Введите вторую строку (не более 80 символов) :

cout<<" Введите вторую строку (не более 80 символов) : "<<endl;

cin>>s2;

 

my_string1.init(s1);

//инициализация объекта my_string1

my_string2.init(s2);

//инициализация объекта my_string2

cout <<"\nString1 - String2 = "; // вывод на экран разности двух строк cout << my_string1 - my_string2 << endl;

return 0;

function

У

Р

String1 – String2 = 9

использованиемИ

 

При перегрузке бинарного оператора с

компоненты-

функции ей передается в качестве параметра только один аргумент. Второй ар-

Б

гумент получается посредством использования неявного указателя this на объ-

ект, компоненты которого модифицируются.

Г

5.2.2. Перегрузка унарного оператора

При перегрузке унарной опер ции функция operator не имеет параметров.

Как и в предыдущем случае, модифицируемый объект передается в функцию-

 

е

this.

operator неявным образом, используяазательу

Унарный оператор, как и кбинарный, может быть перегружен двумя спо-

собами:

т

 

 

 

-

как компонен а-функция без аргументов;

-

но

как глобальная функция с одним аргументом.

Как извест , унарный оператор может быть префиксным и постфикс-

ным. Для юбого префиксного унарного оператора выражение #a может быть

л

первом способе как a.operator#(), а при втором как

представ ено

 

#operator(a).

при

При перегрузке унарного оператора, используемого в постфиксной фор-

ме, выражение вида a# может быть представлено при первом способе как

Б

 

a.operator#(int)б

или как operator#(a,int) при втором способе. При этом аргу-

мент т па int не существует и используется для отличия префиксной и пост- фиксной форм при перегрузке.

Ниже приведен пример программы перегрузки оператора ++ и реализации множественного присваивания. Для перегрузки унарного оператора ++, пред- шествующего оператору ++i, вызывается функция operator ++(). В случае если оператор ++ следует за операндом i++, то вызывается функция operator++(int x), где х принимает значение 0.

#include «iostream» using namespace std;

109

class dek_koord

 

 

 

 

 

 

 

 

 

 

{ int x,y; //

декартовы координаты точки

 

 

 

 

 

 

public:

 

 

 

 

 

 

 

 

 

 

 

 

dek_koord(){};

 

 

 

 

 

 

 

 

 

 

dek_koord(int X,int Y): x(X),y(Y) {}

 

 

 

 

 

 

void operator++();

 

 

 

 

 

 

 

 

 

void operator++(int);

 

 

 

 

 

 

 

 

dek_koord operator=(dek_koord);

 

 

 

 

 

};

void see();

 

 

 

 

 

 

 

 

 

Р

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

И

void dek_koord::operator++()

// перегрузка операции ++A

 

 

{ x++;}

 

 

 

 

 

 

 

 

У

 

void dek_koord::operator++(int)

 

 

 

 

// перегрузка операции A++

 

 

{ y++;}

 

 

 

 

 

 

 

 

 

 

 

dek_koord dek_koord::operator =(dek_koord a)

Б

 

 

 

}

 

 

 

 

 

 

 

 

 

 

{ x=a.x;

 

 

 

 

 

// перегрузка операции =

 

 

 

 

y=a.y;

 

 

 

 

 

 

 

Г

 

 

 

return *this;

 

 

 

 

 

 

 

 

 

 

 

void dek_koord::see()

 

 

е

 

 

 

 

 

{ cout << "координата х = " << x << endl;а

 

 

 

 

}

cout << "координата y = " << y << endl;к

 

 

 

 

 

 

 

 

 

о

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

 

т

 

 

 

 

 

{ dek_koord A(1,2), B, C;

 

 

 

 

 

 

A.see();

л

 

 

 

 

 

 

 

A++;

 

//

уве чение значения компоненты х объекта А

 

A.see();

 

//

просмотр содержимого объекта А

 

 

 

 

++A;

 

//лиуве чение значения компоненты у объекта А

 

 

и

 

//

просмотр содержимого объекта А

 

 

 

 

A.see();

 

 

 

 

 

C=B=A;

 

// множественное присваивание

 

 

 

 

 

B.see();б

 

 

 

 

 

 

 

 

 

 

}

C.see();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

БРезультат работы программы:

 

 

 

 

 

 

координата х = 1 координата y = 2 координата х = 1 координата y = 3 координата х = 2 координата y = 3

110

координата х = 2 координата y = 3 координата х = 2 координата y = 3

5.2.3. Дружественная функция operator

Функция operator может быть не только членом класса, но и friend- функцией этого класса. Как было отмечено ранее, friend-функции, не являясь компонентами класса, не имеют неявного указателя this. Следовательно, при перегрузке унарных операторов в функцию operator передается один, а бинар-

ных два аргумента. Необходимо отметить, что операторы: =, (), [] и -> не могут быть перегружены с помощью friend-функции operator.

 

#include <iostream>

 

 

 

 

 

Р

 

using namespace std;

 

 

 

 

 

 

 

 

 

 

И

 

class dek_koord

 

 

 

 

 

{

int x,y;

// декартовы координаты точки

 

 

У

 

 

public:

 

 

 

 

 

 

 

dek_koord(){};

 

 

Г

 

 

 

 

dek_koord(int X,int Y): x(X),y(Y) {}

 

 

 

 

 

 

 

 

 

 

friend dek_koord operator*(int,dek koord);

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

friend dek_koord operator*(dek koord,int);

 

 

 

 

 

dek_koord operator=(dek koord);

 

 

 

 

 

 

 

void see();

а

 

 

 

 

 

};

к

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dek_koord operator*(intеk,dek koord dk) // перегрузка операции int *A

 

{ dk.x*=k;

т

 

 

 

 

 

 

 

dk.y*=k;

 

 

 

 

 

 

 

} return dk;

 

 

 

 

 

 

 

о

 

 

 

 

 

 

 

dek

koordиoperator*(dek_koord dk,int k) // перегрузка операции A*int

 

{ dk.x*=k;

 

 

 

 

 

 

 

 

 

л

 

 

 

 

 

 

 

 

dk.y*=k;

 

 

 

 

 

 

 

 

return dk;

 

 

 

 

 

 

 

 

б

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

dek_koord dek_koord::operator=(dek_koord dk) { x=dk.x;

y=dk.y; return *this;

}

void dek_koord::see()

{ cout << "координаты (х,y) точки = " << x<<’ ’ <<y<< endl;

}

111

int main()

{dek_koord A(1,2), B; A.see();

B=A*2;

// увеличение значения объекта А в 2 раза

 

B.see();

// просмотр содержимого объекта B

 

 

}

 

 

 

 

 

Результат работы программы:

 

 

координаты (х,y) точки =

1

2

 

Р

координаты (х,y) точки =

2

4

 

И

5.2.4. Особенности перегрузки операции =

 

 

Доопределение оператора = позволяет решить проблему присваивания, но

 

 

 

 

У

 

не решает задачи инициализации, так как при инициализации должен вызы-

ваться соответствующий конструктор. В рассматриваемом случае это решается

использованием конструктора копирования.

Г

 

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

 

Б

копировании содержимого объекта в стек (из стека). Вызов конструктора копи-

рования осуществляется при обращении к функции и передаче в нее в качестве параметра объекта (объектов), а также возвра значения (объекта) из функции.

#include <iostream>

к

using namespace std;

 

та

#include "string.h"

 

// ктрукторнс

string();

 

по умолчанию

class string

 

// символьнаяестрока

{ char *str;

 

int size;

 

он

 

 

// длина символьной строки

public:

 

и

 

string(int n,char *s);

// к структор с параметрами

string(const string &); // конструктор копирования

 

б

 

// деструктор

 

~string();

 

 

и

 

 

 

friend stringлoperator+(string, const string);

string &operator=(const string &);

 

Б

 

 

 

 

void see();

 

 

 

};

string::string(){size=0; str=NULL;}; // конструктор по умолчанию string::string(int n,char *s) // конструктор с параметрами

{str=new char[size=n>=(strlen(s)+1)? n : strlen(s)+1]; strcpy(str,s);

}

 

string::string(const string &a)

// описание конструктора копирования

{ str=new char[a.size+1];

// выделяем память под this->str (+1 под ’\0’)

112

 

strcpy(str,a.str);

 

// копирование строки

 

 

size=strlen(str)+1;

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

string::~string(){ if(str) delete [] str;}

 

 

 

 

 

string operator+(string s1, const string s2)

// перегрузка операции +

 

{ string ss;

 

 

 

 

 

 

 

 

 

if(!ss.str) ss.str=new char[ss.size=strlen(s1.str)+strlen(s2.str)+2];

 

for(int i=0; ss.str[i]=s1.str[i]; i++);

 

// перезапись символа ’\0’

 

ss.str[i]=' ';

 

 

 

 

 

// удаление ’\0’

Р

 

 

 

 

 

 

 

 

for(int j=0; ss.str[i+1]=s2.str[j]; i++,j++); // дозапись второй строки

 

return ss;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

У

 

 

string &string::operator =(const string &st)

 

 

 

// перегрузка операции =

 

{ if(this!=&st)

 

// проверка, не копирование лиИобъекта в себя

 

{ delete str;

 

// освобождаем память старой строки

 

str=new char[size=st.size];// выделяем память под новую строку

 

strcpy(str,st.str);

 

 

 

Г

 

 

}

 

 

 

 

Б

 

 

 

return *this;

 

 

 

 

 

 

}

 

 

е

а

 

 

 

 

void string::see()

 

 

 

 

 

{ cout << this->str << endl; к

 

 

 

 

 

}

 

т

 

 

 

 

 

 

int main()

о

 

 

 

 

 

 

 

{ string s1(10,"язык"), s2(30,"программирования"), s3(30," ");

 

s1.see();

 

 

 

 

 

 

 

 

 

s2.see();

 

 

 

 

 

 

 

 

 

л

 

// это только вызов конструктора копирования

 

string s4=s1;

 

s4.see();и

 

 

 

 

 

 

 

 

string s5(s1);

// прямой вызов конструктора копирования

и

 

 

 

 

 

 

 

 

Б

s5.see();

 

 

 

 

 

 

 

 

бs1+s2;

 

// перегрузка +

(вызов функции operator +)

 

s1.see();

 

 

 

 

 

 

 

 

 

s3=s2;

 

// перегрузка =

(вызов функции operator =)

 

s3.see();

 

 

 

 

 

 

 

 

 

s3=s1+s2;

 

//перегрузка операции + , затем операции =

 

s3.see();

 

 

 

 

 

 

 

 

 

return 0;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

Результаты работы программы:

язык

113

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