
Лабораторная работа №3
«Перегрузка операций»
Выполнил: Янковский Д.В.
гр. ПО-41
Коломна, 2011 г.
Исправления ошибок текста программы
-
-исправление описания конструкторов;
-
-добавление конструктора копирования;
-
-добавление перегрузки операции «=»;
Текст программы
#include <iostream>
#include "string.h"
using namespace std;
class String
{ protected:
char *PointerToString; // yказатeль на cтpокy
int StringSize; //Длина cтpоки
public:
String (const char * Str);
String ( String & Str );
~String ( );
void Print();
friend String operator+ ( const String& One, const String& Two );
String& operator= ( const String & Str);
};
// Конcтpyктоp копирования
String::String ( String & Str )
{
StringSize = Str.StringSize;
PointerToString = new char[StringSize + 1];
strcpy ( PointerToString, Str.PointerToString);
}
// Конcтpyктоp преобразования
String::String ( const char * Str )
{
StringSize = strlen(Str);
PointerToString = new char[StringSize + 1];
strcpy ( PointerToString, Str);
}
// Дecтpyктоp
String:: ~String ()
{
StringSize = 0;
delete[] PointerToString;
PointerToString = NULL;
}
// Пepeопpeдeлeниe опepации
String operator+ ( const String& One, const String& Two )
{
String Result(" ");
delete[] Result.PointerToString;
Result.StringSize = One.StringSize + Two.StringSize;
Result.PointerToString = new char[Result.StringSize+1];
strcpy(Result.PointerToString, One.PointerToString);
memcpy(Result.PointerToString+One.StringSize,Two.PointerToString,Two.StringSize+1 );
return Result;
}
String& String::operator= ( const String & Str )
{
if (&Str==this) return *this;
StringSize = Str.StringSize;
PointerToString = new char[StringSize + 1];
strcpy ( PointerToString, Str.PointerToString);
return *this;
}
// Опpeдeлeниe фyнкции вывода объeкта
void String ::Print()
{
cout << PointerToString <<endl;
}
// Пpогpамма, пpовepяющая pаботоcпоcобноcть опepации "+"'
void main()
{
String A("111");
A="000";
A.Print();
String B("222");
B.Print();
String C(" ");
C = A + B;
C.Print();
C = "A" + A + "B";
C.Print();
system("pause");
}
Контрольные вопросы
-
Для чего предназначена перегрузка операций ?
Возможность использования в различных случаях для одной и той же операции операндов различных типов.
-
Какие ограничения существуют при перегрузке ?
• Нельзя изменять количество параметров оператора. Например, нельзя переопределить унарную операцию как бинарную и наоборот
• Нельзя изменять старшинство операторов
• Нельзя определять новые операторы
• Нельзя переопределять операторы принимающие в качестве параметров стандартные типы данных языка, такие как int или char
• Нельзя переопределять следующие операторы: (.), (.*), (::), (?:), а также символы, обрабатываемые препроцессором (символы комментария и т. д.).
-
Как может быть перегружена операция "=" ?
Операция присваивания "=" может перегружаться только объявлением метода без описателя static.
-
Каковы особенности перегрузки операций различной размерности ?
Использование дружественных функций
-
Какое свойство языка Си++ и как используется при доопределении операций ?
Свойство полиморфизм, т. е. возможности использования в различных случаях для одной и той же операции операндов различных типов.
-
Каким образом можно использовать перегруженные операции ?
Перегрузка смысла операций осуществляется посредством определения соответствующих функций, определяющих алгоритм выполнения операции над объектами классов.