C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 17. Дружественные функции / Основы Visual C++ / Visual C++

Основы Visual C++
Урок 17. Дружественные функции

На прошлом уроке мы с вами обсуждали перегрузку операций на примере класса CVector. Векторы, как известно, можно умножать на число. Если мы захотим сделать это для нашего класса, то прототип функции будет такой:

    ...
    CVector operator* (float);
    ...

, а реализация - такой:

CVector CVector::operator* (float s){
    CVector t;
    t.m_x=m_x*s;
    t.m_y=m_y*s;
    return t;
}

Когда же мы будем испытывать нашу перегруженную операцию * в функции main, то обнаружиться, что мы можем умножать только вектор на число, а число на вектор - нет:

void main(){
    CVector a(2, 4), b;
    float k=1.5;
    b=a*k; //верно!
    b=k*a; //не верно!
}

Как же быть? Перегрузить операцию * в нашем классе CVector другим способом не получится (так как слева от перегружаемой операции должен находиться экземпляр класса CVector. Он, как известно, передается неявно). Сделать это можно через дружественные функции. Для этого пишем в нашей программе функцию для перемножения числа и вектора (именно в такой последовательности):

CVector operator*(float s, CVector v){
    CVector t;
    t.m_x=s*v.m_x;
    t.m_y=s*v.m_y;
    return t;
}

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

Но, так как эта функция внешняя по отношению к классу, у нее нет доступа к переменным m_x и m_y (они же ведь помещены в закрытую часть класса CVector!). Для того, чтобы разрешить нашей функции доступ к переменным класса, класс должен объявить ее своим другом. Делается это так:

class CVector{
    friend CVector operator*(float s, CVector v);
    ...

Все! Теперь в функции main мы можем перемножать как число на вектор, так и вектор на число!