Оператор c ++ между двумя типами данных [дубликат]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

88
задан Nawaz 7 January 2011 в 09:19
поделиться

2 ответа

Если вы определяете свою перегруженную функцию в качестве функции-члена, тогда компилятор переводит выражения типа s1 + s2 в s1.operator+(s2). Это означает, что оператор-перегруженная функция-член вызывается в первом операнде. Вот как работают функции-члены!

Но что, если первый операнд не является классом? Есть большая проблема, если мы хотим перегрузить оператор, где первый операнд не является типом класса, а скорее скажем double. Поэтому вы не можете писать так 10.0 + s2. Тем не менее, вы можете записать операторную функцию с перегрузкой для выражений типа s1 + 10.0.

Чтобы решить эту задачу ordering , мы определяем перегруженную функцию оператора как friend, если ей нужно получить доступ private. Сделайте его friend ТОЛЬКО, когда ему нужно получить доступ к закрытым членам. В противном случае просто сделайте функцию non-friend non-member для улучшите инкапсуляцию !

class Sample
{
 public:
    Sample operator + (const Sample& op2); //works with s1 + s2
    Sample operator + (double op2); //works with s1 + 10.0

   //Make it `friend` only when it needs to access private members. 
   //Otherwise simply make it **non-friend non-member** function.
    friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}

Прочтите эти данные: Небольшая проблема упорядочивания в операндах Как функции нечлена улучшают инкапсуляцию

111
ответ дан gedamial 31 August 2018 в 21:11
поделиться

Это не обязательно является различием между перегрузками оператора friend и перегрузками оператора функции члена, как это происходит между перегрузками оператора global и перегрузками оператора функции члена.

Одна из причин, почему перегрузка оператора global - это если вы хотите разрешить выражения, в которых тип класса отображается на правой стороне справа двоичного оператора. Например:

Foo f = 100;
int x = 10;
cout << x + f;

Это работает только при наличии глобальной перегрузки оператора для

Foo operator + (int x, const Foo & amp; f);

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

Независимо, если Foo имеет только перегрузку оператора функции члена, например:

class Foo
{
  ...
  Foo operator + (int x);
  ...
};

... тогда мы могли бы иметь только выражения, где в слева оператора плюс появился экземпляр Foo.

16
ответ дан Charles Salvia 31 August 2018 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: