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



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

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

 

 

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

{
return(a + b);
}

intadd_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 параметрами
}

 

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


 

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

 

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


class Integer

{

private:

int value;

public:

Integer(inti): value(i)

{}

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

return (value + rv.value);

}

};

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


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

 

class Integer

{

private:

int value;

public:

Integer(inti): value(i)

{}

 

 

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

friendconst Integer&operator++(Integer&i);

 

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

friendconst Integer operator++(Integer&i, int);

 

};

 

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

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

i.value++;

returni;

}

 

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

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

Integer oldValue(i.value);

i.value++;

returnoldValue;

}

 


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

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


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

 

class Integer

{

private:

int value;

public:

Integer(inti): value(i)

{}

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

 

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

 

friendbooloperator==(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;

}

 

booloperator==(const Integer& left, const Integer& right) {

returnleft.value == right.value;

}


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

 

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

 

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

 

 

class beta;

class alpha {

private:

    int data;

public:

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

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

};

 

class beta {

private:

    int data;

public:

    beta():data(7) {}

    friendintfrifunc(alpha, beta);

};

 

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

    return (a.data + b.data);

};

 

int main() {
    alpha aa;

    beta bb;

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

    return 0;

}

 

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


Дата добавления: 2018-04-15; просмотров: 437; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!