Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Основы 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 мы можем перемножать как число на вектор, так и вектор на число!



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS