Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты ООП.docx
Скачиваний:
2
Добавлен:
21.04.2019
Размер:
87.01 Кб
Скачать
  1. Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.

Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения.

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

int add_values(int a,int b) //Перегруженная функция (2 параметра)

{     return(a + b);  }

int add_values (int a, int b, int c) // Перегруженная функция (3 параметра)

{    return(a + b + c);  }

void main(void)

{     cout << "200 + 801 = " << add_values(200, 801) << endl; // Использование функции с 2 параметрами    cout << "100 + 201 + 700 = " << add_values(100, 201, 700) << endl; // Использование функции с 3 параметрами }

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

  1. Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).

Синтаксис перегрузки

class Integer

{

private:

int value;

public:

Integer(int i): value(i)

{}

const Integer operator+(const Integer& rv) const { //перегрузка унарного оператора

return (value + rv.value);

}

};

Перегрузка унарных операторов

Рассмотрим примеры перегрузки унарных операторов(++,--) для определенного выше класса Integer. Заодно определим их в виде дружественных функций и рассмотрим операторы декремента и инкремента:

class Integer

{

private:

int value;

public:

Integer(int i): value(i)

{}

//префиксный инкремент

friend const Integer& operator++(Integer& i);

//постфиксный инкремент

friend const Integer operator++(Integer& i, int);

};

//префиксная версия возвращает значение после инкремента

const Integer& operator++(Integer& i) {

i.value++;

return i;

}

//постфиксная версия возвращает значение до инкремента

const Integer operator++(Integer& i, int) {

Integer oldValue(i.value);

i.value++;

return oldValue;

}

В случае, когда он видит выражение ++i, то вызывается функция operator++(a). Если же он видит i++, то вызывается operator++(a, int). То есть вызывается перегруженная функция operator++, и именно для этого используется фиктивный параметр int в постфиксной версии.

Бинарные операторы

Рассмотрим синтаксис перегрузки бинарных операторов. Перегрузим один оператор, который возвращает l-значение, один условный оператор и один оператор, создающий новое значение (определим их глобально):

class Integer

{

private:

int value;

public:

Integer(int i): value(i)

{}

friend const Integer operator+(const Integer& left, const Integer& right);

friend Integer& operator+=(Integer& left, const Integer& right);

friend bool operator==(const Integer& left, const Integer& right);

};

const Integer operator+(const Integer& left, const Integer& right) {

return Integer(left.value + right.value);

}

Integer& operator+=(Integer& left, const Integer& right) {

left.value += right.value;

return left;

}

bool operator==(const Integer& left, const Integer& right) {

return left.value == right.value;

}

  1. Друзья класса: их назначение, области применения. Определение и использование функции-друга класса. Различия между членами и друзьями класса. Функции и перегруженные операторы – члены и друзья класса.

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

C++ позволяет друзьям определенного класса обращаться к частным элементам этого класса. Чтобы указать C++, что один класс является другом (friend) другого класса, вы просто помещаете ключевое слово friend и имя соответствующего класса-друга внутрь определения этого другого класса.

class beta;

class alpha {

private:

int data;

public:

alpha():data(3) {} //конструктор без аргументов

friend int frirunc(alpha, beta); // дружественная функция

};

class beta {

private:

int data;

public:

beta():data(7) {}

friend int frifunc(alpha, beta);

};

int frifunc(alpha a, beta b) { //определение функции

return (a.data + b.data);

};

int main() { alpha aa;

beta bb;

cout << frifunc(aa, bb) << endl; // вызов функции

return 0;

}

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