Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД_ответы_catsto_NEW.doc
Скачиваний:
17
Добавлен:
16.04.2019
Размер:
365.57 Кб
Скачать

Int m_nYear;

Int m_nMonth;

Int m_nDay;

public:

CDate();

CDate(int Year, int Mon=1, int Day=1);

~CDate() {}

bool operator < (CDate &d) {

return m_nYear < d.m_nYear || (m_nYear == d.m_nYear && m_nMonth < d.m_nMonth) || (m_nYear == d.m_nYear && m_nMonth == d.m_nMonth && m_nDay < d.m_nDay);}};

Фактически мы определили метод класса, который включает ключевое слово operator и значок операции. Сделали это inline.

Теперь наши объекты можно сравнивать, например:

cout << (t < d) << “ “ << (d < e) << endl;

Оператор < возвращает булевское значение. Что бы сделать это понятнее приведем две эквивалентных формы записи:

t < d;

t.operator<(d);

Т.е. запись операции эквивалентна вызову функции специального вида. Эта функция возвращает булевское значение, которое и должно возникать в результате операции сравнения.

Эта возможность C++ позволяет не только сделать разработанные нами классы неотличимыми от встроенных типов, но и добиться высокой наглядности текстов программ, а так же открывает возможность для применения шаблонов.

Для C#

В C# используются два вида операторов унарные и бинарные( операторы, для которых указываются два операнда). Для их перегрузки используют 2 метода

Public static ret-type operator op(param-type operand)

{//операции}

Public static ret-type operator op(param-type operand1, param-type operand2)

{//операции}

Эффективность программ и inline методы:

Когда возвращается ссылка, то повышается эффективность, поскольку очевидный способ реализации ссылки - это указатель, а передача указателя гораздо дешевле, чем передача большой структуры данных.

В С++ можно задать функцию, которая на самом деле не вызывается, а её тело встраивается в программу в месте её вызова. Она действует почти так же как, как мокроопределение с параметром в С. Они не связаны с механизмом вызова функций и возврата ими значений. Поэтому могу выполняться гораздо быстрее. Недостатком является то, что если они слишком большие и вызываются слишком часто, объем программ сильно возрастает. Из-за этого применение встраиваемых функций обычно ограничивается короткими функциями. Для объявления встраиваемой функции нужно пере ней написать inline. Пример:

Inline int even(int X)

{

Return!(x%2);}

Возвращает истину при чётном аргументе. Функция должна быть определена до того как будет использована. Inline для компилятора является запросом, а не командой. Если компилятор не в состоянии выполнить запрос, функция будет компилироваться как обычная функция, а запрос inline проигнорирован.

Назначение метода GetHashCode в .Net.

В ряде случаев возникает необходимость реализации интерфейса IEqualityComparer(Of T). Это может понадобиться для работы инструкции Distinct в LINQ-запросах или соответствующей функции, для удаления из коллекции повторяющихся элементов, в ситуации, когда равенство объектов надо определить по-своему; и для коллекции  System.Collections.Generic.HashSet(Of T), которая не принимает двух одинаковых объектов, однако их "одинаковость" может определяться при помощи объекта реализующего данный интерфейс.

В целом реализация этого интерфейча не вызывала бы сложностей, если бы не одно "но", а именно - функция GetHashCode.

Начнём по порядку.