Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
inf_otvety_24-40.docx
Скачиваний:
71
Добавлен:
11.05.2015
Размер:
136.35 Кб
Скачать

Второй пример

При создании ваших собственных типов данных с помощью классов наиболее общей операцией будет проверка, являются ли два объекта одинаковыми. Используя перегрузку, ваши программы могут перегрузить операторы равенства (==), неравенства (!=) или другие операторы сравнения. Следующая программа COMP_STR.CPP добавляет новый оператор в класс string, который проверяет, равны ли два объекта string.Используя перегрузку операторов, ваши программы могут проверять, содержат ли строковые объекты одинаковые строки, как показано ниже:

if (some_string == another_string)

Ниже приведена реализация программы COMP_STR.CPP:

#include <iostream.h>

#include <string.h>

class string

{  public:     string(char *); // конструктор     char * operator +(char *);     char * operator -(char);     int operator ==(string);     void show_string(void);  private:     char data[256];  };

string::string(char *str)

{     strcpy(data, str);  }

char * string::operator +(char *str)

{     return(strcat(data, str));  }

char * string::operator -(char letter)

{     char temp[256];     int i, j;     for (i = 0, j = 0; data[i]; i++) if (data[i] 1= letter) temp[j++] = data[i];     temp[j] = NULL;     return(strcpy(data, temp));  }

int string::operator ==(string str)

{     int i;     for (i = 0; data[i] == str.data[i]; i++)     if ((data[i] == NULL) && (str.data[i] == NULL)) return(1); // Равно    return (0); //He равно  }

void string::show_string(void)

{     cout << data << endl;  }

void main(void)

{     string title( "Учимся программировать на C++");     string lesson("Перегрузка операторов");     string str( "Учимся программировать на C++");     if (title == lesson) cout << "title и lesson равны" << endl;     if (str == lesson) cout << "str и lesson равны" << endl;     if (title == str) cout << "title и str равны" << endl;  }

Как видите, перегружая операторы подобным образом, вы упрощаете понимание ваших программ.

Операторы, которые Вbl he можете перегрузить

В общем случае ваши программы могут перегрузить почти все операторы С++. В табл. 24 перечислены операторы, которые C++ не позволяет перегружать.

Таблица 24. Операторы C++, которые ваши программы не могут перегрузить.

Оператор

 

Назначение

Пример

.

Выбор элемента

object.member

.*

Указатель на элемент

object.*member

::

Разрешение области видимости

classname::member

?:

Условный оператор сравнения

с = (а > b) ? а : b;

29. Дружественные классы.

Если все методы какого-либо класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным с помощью ключевого слова friend. В приведенном ниже примере класс mistress объявляется дружественным классу hero:

class hero{

... friend class mistress;}

class mistress{

... void f1();

void f1();}

Функции f1 и f2 являются дружественными по отношению к классу hero (хотя и описаны без ключевого слова friend) и имеют доступ ко всем его полям.

Объявление friend не является спецификатором доступа и не наследуется. Обратите внимание на то, что класс сам определяет, какие функции и классы являются дружественными, а какие нет.

Объявление дружественного класса позволяет всем его методам получить доступ ко всем переменным и методам другого класса.

Например:

class A {public: int Fx();}

class B {public:

friend class A;

private:

}

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

Например:

class A {public:

// Класс расположен во внешней

// области видимости

int Fx1();

}

namespace classB {

class B {public:

friend class A;

friend class C;

private:

}

class C { public:

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

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

int Fx2();

}

}

Дружественные классы не наследуются, и их дружественность не является транзитивной.

Например:

class A {int Fx();}

class B {friend class A;}

class C {friend class B;}

// Класс А не является

// дружественным классу C

class D : public B {}

// Класс А не является

// дружественным классу D

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