Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 18:20   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://cplusplus.com/doc/tutorial/classes2/
так же смотреть таблицу в конце раздела про перегрузку.

членами класса не могут операторы которые не соответствуют тому что this левый.
то есть если к примеру нам нужен
Код:
std::ostream<<MyClass
, надо внешний оператор делать.
но если мы хотим MyClass<<std::istream, то вполне можно сделать членом класса MyClass.
Код:
// vectors: overloading operators example
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int,int);
    CVector operator + (CVector);
};

CVector::CVector (int a, int b) {
  x = a;
  y = b;
}

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

int main () {
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x << "," << c.y;
  return 0;
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2012, 18:29   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

То есть, вы хотите сказать, что это:
CVector operator + (CVector); //бинарный оператор ?
Просто его lValue - это *this ?

Ну если вы так считаете, то я вам скажу, что бинарный оператор бинарному оператору рознь.

Test& operator+(Test& left, Test& right); //не имеет права быть мембером. А значит обязан быть только статиком.
Test& operator+(const Test& crc);

Ничего такого странного не замечаете?
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 19:37   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да lValue это this. насчет странного второе это внешний оператор. внешние не имеют права быть членами класса
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2012, 19:40   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в смысле внешний тот что принимает два аргумента
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2012, 19:44   #15
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Test& operator+(Test& left, Test& right); //не имеет права быть мембером. А значит обязан быть только статиком.
Поспорю. Не обязательно статиком. Может и фрэндом быть.
_-Re@l-_ вне форума Ответить с цитированием
Старый 03.01.2012, 20:05   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да lValue это this. насчет странного второе это внешний оператор. внешние не имеют права быть членами класса
Смысл в том, что любой "внешний" оператор - это глобальная функция.
А любая глобальная функция - это статическая функция.

Есть конечно разница между "просто глобальной функцией" и "статической глобальной функцией", но это уже немножко из другой оперы.


А вот товарищ Riffi заявил, что "внешний оператор" , представленный в коде сабжа, который автор топика по глупости запихал в класс - это не статическая функция, в чем он очень сильно ошибается.

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Поспорю. Не обязательно статиком. Может и фрэндом быть.
мухи отдельно, котлеты отдельно.

"дружественность" и "статичность" функции - это два перпендикулярных понятия.

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

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

А вот не_статическим "внешний глобальный оператор" быть не может.

Последний раз редактировалось _Bers; 03.01.2012 в 20:24.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 20:11   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

делетеделетеделете

Последний раз редактировалось _Bers; 03.01.2012 в 20:23.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 20:37   #18
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Френд - это друг класса. Особое указание компилятору, что функция, описанная данным прототипом имеет доступ ко всем данным-членам класса.
Ну как вам сказать! Я вроде бы знал это.
Но вы прям так написали, "обязана"...
_-Re@l-_ вне форума Ответить с цитированием
Старый 03.01.2012, 20:46   #19
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ну как вам сказать! Я вроде бы знал это.
Но вы прям так написали, "обязана"...
Вот эта фраза намекает, что какая то каша в голове присутствует:
Поспорю. Не обязательно статиком. Может и фрэндом быть.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 23:38   #20
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

_Bers


Цитата:
2. Почему статик функция находится внутри класса без соответствующего модификатора?

потому что это не статик-функция ops:

То есть, вы считаете, что бинарные операторы не обязаны быть статиками? И их можно сделать мемберами классов, да?

я ответил на вполне конкретный вопрос, а вот о чем был выданный вами поток сознания мессадж я поначалу даже не понял, но, почитав чуть далее:

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

... А любая глобальная функция - это статическая функция. ...

все стало очевидно - вы просто не понимаете что такое "статическая функция" и назначение ключевого слова static.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новогодний хранитель экрана made in programmersforum.ru _PROGRAMM_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 05.01.2012 12:37
Игра "Новогодний хоровод" Phoenix77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 02.02.2009 18:18
С днём студента! Greblin Свободное общение 5 26.01.2009 02:24
Мой новогодний компьютер meg33 Свободное общение 2 27.12.2007 16:16