Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_CPP.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
311.81 Кб
Скачать
  1. Вложенные классы. Локальные классы.

Класс, объявленный внутри другого класса, называется вложенным классом. Класс, в котором объявлен вложенный класс, называется объемлющим классом.

Функции объемлющего класса не имеют прав доступа к закрытым элементам своего вложенного класса. Так же и функции вложенного класса не имеют прав доступа к закрытым элементам класса, внутри которого он объявлен. Чтобы предоставить такие права вложенному или объемлющему классу, нужно объявить такой класс другом соответственно объемлющего или вложенного класса.

Пример:

Class matrix

{long n, m; //размер матрицы

double *p; //указатель на матрицы

matrix (); //конструктор

class row

{long m; //размер строки

double *p; //указатель на строку

public

};

……

};

Локальные классы.

Класс, определённый внутри тела функции, называется локальным.

Такой класс виден только внутри тела функции. Функции локального класса должны определяться внутри самого класса.

Пример:

Int inc (int n)

{class Inc

{int inc (int n) {return ++n;} };

Inc i;

return i. inc (n);

}

Int main ()

{cout<<inc (10)<<endl; //n = 11

return 0;

}

  1. Общие правила перегрузки операторов.

В языке С++ операторы рассматриваются как функции, имеющие следующий синтаксис:

Возвращаемый_тип operator имя_оператора (список_параметров)

Возвращаемый тип – тип данных, возвращаемых функцией, operator – ключевое слово, имя оператора – «+», «-», «>» и т.д., список параметров определяет перечень операндов, участвующих в операции.

В силу того, что оператор представляется функцией, их как и функции можно перегружать. Перегружаются почти все операторы за исключением следующих случаев:

1. нельзя перегрузить следующие операторы: «.» - оператор доступа к членам класса, «.*» - оператор доступа к члену класса через указатель, «::» - оператор разрешения области видимости, «:?» - условный оператор.

2. нельзя перегружать препроцессорные символы: «#» - преобразование в строку, «##» - соединение строк.

3. нельзя перегружать операторы преобразования типов данных: «static_cast», «dinamic_cast», «reinterpret_cast», «const_cast».

Перегрузка операторов должна удовлетворять следующим требованиям:

    1. нельзя вводить новые операторы;

    2. не допускается перегрузка операторов со встроенными типами данных в качестве параметров. По крайней мере, один параметр перегружаемого оператора должен быть классом.

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

    4. приоритеты перегруженных операторов не изменяются;

    5. оператор не может иметь аргументов по умолчанию, за исключением оператора вызова функции ();

    6. оператор не может иметь неопределённого количества параметров, за исключением оператора вызова функции ().

Перегруженные операторы разрешается определять как члены класса и как функции, не являющиеся членами класса. Один оператор может быть перегружен несколько раз. Если оператор перегружен как член класса, то он не должен иметь спецификатор static и его первым операндом по умолчанию является объект класса, для которого вызывается этот оператор. Перегруженные операторы можно определять прямо в теле класса как встроенные функции. Перегруженные операторы могут вызываться двумя способами: явно (как функция) или неявно (используя операторную запись).

Пример:

//класс ratio

Ratio a (1, 2), b (1, 2), c (0, 1);

c.operator += (a); //явно

c += a; //неявно

c = operator + (a, b); //явно

c = a + b; //неявно

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