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

28. Поразрядное копирование. Особенности перегрузки оператора присваивания.

Для оператора = компилятор поддерживает скрытую функцию по умолчанию, которая копирует данные объекта, стоящего справа от знака =, в объект, стоящий слева. Такое исполнение оператора неверно для классов. Где используется динамическое выделение память, поэтому для них оператор = всегда следует перегружать. В определении операторной функции-члена необходимо учитывать, что присвоение модифицирует существующее значение операнда, который стоит слева от знака оператора.

class COffice

{

private:

char m_namedok[30]; //название документа

int m_date[3]; //дата подписания

int m_kode; //код документа

public: …..

};

COffice& COffice :: operator=(COffice &x1)

{

strcpy( m_namedok, x1.m_namedok);

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

{

m_date[i]=x1.m_date[i];

}

return *this;}

29. Перегрузка операторов отношений. Примеры.

Результат переменной целого либо логического типа, не совпадает с типом объектов. Значение операндов не изменяется (поэтому их можно передавать и по значению, и по ссылке)

int operator# (класс оп_2)

{

.

return знач_int;

}

Через функцию друг:

int friend operator# (класс оп_1, класс оп_2)

{…. return знач_int; }

#include <iostream.h>

#include <string.h>

class String {

private: char *str;

public: String()

{ str= new char;

str='\0';}

String (char *s)

{ int kol=strlen(s);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, s);

}

String (String &obj)

{ int kol=strlen(obj.str);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, obj.str);

}

bool operator<(String &obj)

{ if (strlen(str)<strlen(obj.str))

return 1;

return 0;}

};

30. Перегрузка логических операторов. Примеры.

Результат переменной целого либо логического типа, не совпадает с типом объектов. Значение операндов не изменяется (поэтому их можно передавать и по значению, и по ссылке)

int operator# (класс оп_2)

{

.

return знач_int;

}

Через функцию друг:

int friend operator# (класс оп_1, класс оп_2)

{…. return знач_int; }

#include <iostream.h>

#include <string.h>

class String {

private: char *str;

public: String()

{ str= new char;

str='\0';

}

String (char *s)

{ int kol=strlen(s);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, s);

}

String (String &obj)

{ int kol=strlen(obj.str);

str=new char (kol);

if (!str)

cout<<"ERROR";

strcpy(str, obj.str);

}

bool operator!()

{ if (strlen(str)!=0)

return 1;

return 0;

}};

31. Перегрузка арифметических операторов. Примеры.

В общем случае результат должен оставаться объектом того же класса, поэтому как правило результат – временный объект этого же класса, который и возвращается после выполнения оператора. Исходные значения меняться не должны. Возвращается результат.

class COffice

{

private:

char m_namedok[30]; //название документа

int m_date[3]; //дата подписания

int m_kode; //код документа

public: …..

};

COffice operator+ (COffice obj, char* str)

{

COffice Temp;

strcpy(Temp.m_namedok, obj.m_namedok);

strcat(Temp.m_namedok, str);

if(strlen( (obj.m_namedok)+strlen(str)) >= 30 )

Temp.m_namedok[29]='\0';

return Temp;

}