Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявления перегруженных операторов, Методы класса или свободные функции? 
V
    Опции темы
ChipNDale
Дата 23.11.2012, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



Доброго времени суток.
Скорее всего, данный вопрос уже обсуждался, но мои попытки поиска ничего не дали.

Вопрос в следующем. Перегруженные операторы могут быть как методами класса, так и свободными функциями. Есть ли какие-нибудь рекомендации какому способу следует отдавать предпочтение?
Также в книгах случалось видеть, что к полям аргументов доступ осуществлялся напрямую - без геттеров (в случае если оператор является методом класса или свободная функция объявлена дружественной). Насколько это хорошая/распространенная практика?
PM MAIL   Вверх
azesmcar
Дата 23.11.2012, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ChipNDale @  23.11.2012,  04:50 Найти цитируемый пост)
Перегруженные операторы могут быть как методами класса, так и свободными функциями. Есть ли какие-нибудь рекомендации какому способу следует отдавать предпочтение?

Если могут быть свободными функциями, то лучше писать свободные. Методы стоит писать, когда нужен доступ к приватным членам класса.

Но одним методом часто не обойтись.
Вот типичный пример проблемы с методами:
Код

class X
{
    int a_;
public:
    X(int a): a_(a) {}

    X operator + (int val) const
    {
        return X(a_ + val);
    }
};


Можно вызвать оператор следующим образом
Код

X obj1 = X(5);
X obj2 = obj1 + 10;


в данном случае код будет интерпретирован так
Код

X obj1 = X(5);
X obj2 = obj1.operator + (10);


Но если попробуем сделать наоборот - получим ошбику
Код

X obj1 = X(5);
X obj2 = 10 + obj1;


так как для int нет оператора + принимающего объект типа X.

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

X operator + (int val, const X& obj)
{
    return obj.operator + (val);
}


Если нужен доступ к приватным данным, то метод лучше, чем friend.

Код

class X
{
    int a_;
public:
    X(int a): a_(a) {}

    friend X operator + (const X& obj, int val)
    {
        return X(obj.a_ + val);
    }

    friend X operator + (int val, const X& obj)
    {
        return X(obj.a_ + val);
    }
};

Кто не в курсе, friend ... operator в классе объявляет дружественную свободную функцию в ближайшем пространстве имен.

If a friend declaration in a
non-local class first declares a class or function83) the friend class or function is a member of the innermost
enclosing namespace.


Вообще, это касается не только операторов. Если функцию или оператор можно написать свободной (т.е. не требуется доступ к защищенным или приватным данным), то ее следует писать свободной. Где-то была уже дискуссия на эту тему..попробую найти.
PM   Вверх
borisbn
Дата 23.11.2012, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



лень переводить
Цитата

A member function requires that the left hand operator must be of that type. A friend function can allow implicit casting on the left hand operator.

So for example, lets say we create a BigInt class. And we create a member function operator + to take a right hand operator of BigInt.

Now lets also say BigInt has a constructor that takes a regular int. This constructor is NOT explicit (explicit keyword) and it takes one parameter. That means C++ can implitily convert from int to BigInt.

When we have these things we can do this:

BigInt foo( 5 ); BigInt bar; bar = foo + 5;

But we CAN'T do this:

BigInt foo( 5 ) BigInt bar; bar = 5 + foo;

However, if we used a friend function instead of a member function then both will work.


подробнее - http://stackoverflow.com/questions/2770745...member-function


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tzirechnoy
Дата 23.11.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Если требуются виртуальные функцыи (изменение поведения в унаследованных классах) -- то только методы (возможно, с обёртками из свободных функцый, как тут рекомендовали, для работы с не самыми левыми значениями).

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.