Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298

Как переопределять операторы

12.06.2020, 13:43. Показов 4468. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И снова добрый день.

Имеем: я - уровень днище, который не понимает как переопределять опереаторы(все: унарные, бинарные). Слабое знание английского.

Что делал:
1. Учебники.
2. Интернет.
Итог:
Интернет выдает "перегрузку операторов", учебники пишут код без объяснения, мне не понять.

Вопрос:
1. Есть какая-нибудь статься, ссылка на нее, отрывок из учебника где для идиотов вроде меня написано как переопределять операторы. Для идиотов имеется в виду каждое слово в коде и почему оно стоит там и что оно делает. Ключевой момент: КАЖДОЕ СЛОВО, КАЖДАЯ ЗАКОРЮЧКА.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2020, 13:43
Ответы с готовыми решениями:

Как переопределять пути (с POST на GET)
Добрый день. Создал Контроллер Sessions: class SessionsController < ApplicationController def new end def create render...

Можно ли переопределять размерность массива
Пример вначале массив состоял из 20 элементов, после манипуляций нужно его размерность уменьшить или увеличить. Как это сделать?

С++.Операторы в С++: условные операторы, операторы break и continue
Выяснить, пересекаются ли параболы у=аx2+bx+с и у=dx2+ex + f. При положительном ответе найти точки пересечения.

30
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.06.2020, 01:18
Студворк — интернет-сервис помощи студентам
Fulcrum_013, ты пессимист, читая тебя про C++ , в унитаз тебя, я тебя не слушаю.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.06.2020, 11:01
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++
1
2
3
4
5
6
7
#include <iostream>
struct StructComplex {
 int re, im;
};
int operator + (const StructComplex& inputValue_1, const StructComplex& inputValue_2) {
 return inputValue_1.re + inputValue_2.re; 
}
по мне так лучше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
struct StructComplex
{   int re, im;
    int operator+ (const StructComplex& inputValue)
    {   return inputValue.re + re;
    }
};
 
int main()
{   StructComplex instanceA = { 10, 20 };
    StructComplex instanceB = { 30, 40 };
    std::cout << instanceA + instanceB;
 
    return 0;
}
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
16.06.2020, 12:03  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Palich, та нет на самом деле никакого ньюанса. банально operand1 + operand2 компилятор преобразовывает в operator + (operand1, operand2) кста можно и так писать - operator + - это имя функции/метода. т.к. operand1.operator + (operand2) тоже можно. и classname::operator + (operand2) тоже. это во всю используется при переопределении в наследнике. Для встроенных типов эти функции зашиты в ядро и их переопределить нельзя.
Разница же перегрузки ++ и + только в том что + бинарный оператор - т.е. функция принимает 2 параметра (соответсвенно функция-член один явный и один неявный this первого операнда). А оператор ++ унарный. т.е. реализующая функция должна иметь один аргумент (ну или опять же 0 явных аргументов для метода).
Ньюанс же в чем - ++ и -- бывают как инфиксный так и постфиксный. для инфиксного используется 0 аргументов. т.е. метод operator ++() будет вызван для ++operand . а для того чтобы отличить постфиксный т.е. operand ++ в его сигнатуру перегрузки добавлен фиктивный параметр int;
т.е
Это знаю, проблема была в понимании что возвращать при переопределении функции и смотри ниже:
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++
Выделить код
1
int operator + (const StructComplex & inputValue_1, const StructComplex & inputValue_2){
чтобы не запортить ненароком значения которые не требуют изменений в данной функции.
Но в таком применении как у вас далее по тексту это ни на что повлиять не должно.
и в этом. Я думал что делать входящий параметр константой нужно в путанном коде, у меня же все просто и я не делал вход.параметр константой. В итоге из-за этого и не компилировалось.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Для обеспечения симметричности как раз используются свободные функции для операторов, а не члены класса. В частном случае можно использовать свободные friend-функции.
Спасибо!

Добавлено через 50 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
struct StructComplex {
    int re, im;
};
int operator + (const StructComplex& inputValue_1, const StructComplex& inputValue_2) {
    return inputValue_1.re + inputValue_2.re;     
}
int main() {
    StructComplex instanceA = { 10, 20 };
    StructComplex instanceB = { 30, 40 };
    std::cout << instanceA + instanceB;
 
    return 0;
}
все компилится и даже считает правильно. Во всяком случае MSVC++
все же не компилится у меня.

Если написать отдельно этот код то все ок, а в "общем коде"(создал файл и в нем переопределяю операторы, строки и пр, в общем тренируюсь), компилятор пишет:
error: cannot convert 'StructComplex' to 'int' in initialization

компилятор -> GNU GCC
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.06.2020, 12:05
Цитата Сообщение от Palich Посмотреть сообщение
а в "общем коде"
ну дык то надо общего кота погладить. ну в смысле посмотреть на него хотя бы. Глядишь и заурчит.
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
16.06.2020, 12:09  [ТС]
весь код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
 
using namespace std;
 
struct StructComplex{
    int re = 0;
    int im = 0;
    StructComplex (int inputRe, int inputIm)
    : re(inputRe), im(inputIm) {}
};
 
 
StructComplex operator + (StructComplex & inputValue_1, StructComplex & inputValue_2){
    return StructComplex(inputValue_1.re + inputValue_2.re, inputValue_1.im + inputValue_2.im);
}
 
StructComplex operator + (StructComplex & inputValue_1, int inputValue_2){
    return StructComplex (inputValue_1.re + inputValue_2, inputValue_1.im);
}
 
int operator + (const StructComplex & inputValue_1, const StructComplex & inputValue_2){
    return inputValue_1.re + inputValue_2.re;
}
 
struct StructComplex_2{
    int re_2 = 0;
    int im_2 = 0;
    StructComplex_2 (int inputRe_2, int inputIm_2)
    : re_2(inputRe_2), im_2(inputIm_2) {}
 
    StructComplex_2 operator - (StructComplex_2 inputValue_2){
        return StructComplex_2(this->re_2 - inputValue_2.re_2, this->im_2 - inputValue_2.im_2);
    }
 
    friend StructComplex_2 operator - (const StructComplex_2 & inputValue_1, int inputValue_2){
        return StructComplex_2 (inputValue_1.re_2 - inputValue_2, inputValue_1.im_2);
    }
 
    friend StructComplex_2 operator - (int inputValue_1, const StructComplex_2 & inputValue_2){
        return StructComplex_2 (inputValue_1 - inputValue_2.re_2, inputValue_2.im_2);
    }
};
 
int main(){
 
    StructComplex instanceA = {10, 20};
    StructComplex instanceB = {30, 40};
    StructComplex instanceC = instanceA + instanceB;
    StructComplex instanceD = instanceA + 1;
    int mainRe = instanceA + instanceB;
    StructComplex_2 instanceA_2 = {10, 20};
    StructComplex_2 instanceB_2 = {30, 40};
    StructComplex_2 instanceC_2 = instanceB_2 - instanceA_2;
    StructComplex_2 instanceD_2 = instanceA_2 - 1;
    StructComplex_2 instanceE_2 = 1 - instanceB_2;
 
    return 0;
}
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.06.2020, 12:13
Palich, ну правильно не компилит
C++
1
2
3
StructComplex operator + (StructComplex& inputValue_1, StructComplex& inputValue_2) {
    return StructComplex(inputValue_1.re + inputValue_2.re, inputValue_1.im + inputValue_2.im);
}
что возвращает? А ты его в инт загнать пытаешся.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.06.2020, 12:16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А ты его в инт загнать пытаешся.
для инта там есть другой метод, но вот только
в с++ функции нельзя перегрузить по выходному(возвращаемому) значению!
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.06.2020, 12:25
Цитата Сообщение от XLAT Посмотреть сообщение
в с++ функции нельзя перегрузить по выходному(возвращаемому) значению!
и очень правильно что нельзя.

Добавлено через 6 минут
Цитата Сообщение от XLAT Посмотреть сообщение
для инта там есть другой метод, но вот только
только он для аргументов другого типа - const ComplexStruct. фактические аргументы неконстантные так что выберет первую перегрузку.
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
16.06.2020, 12:43  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
что возвращает? А ты его в инт загнать пытаешся.
мне кажется, не на той строке сфокусировался. Мне так кажется.
По твоему вопросу: возвращает нестандартный тип вида структуры.

по ошибке в сообщении №25 на форуме:
Как я виже выполнение кода: компилятор доходит до строки 50, дальше ищет подходящий переопределенный оператор, т.к. в строке 50 L-значение инт, R-значения все типа структуры, то как я вижу, компилятор должен подобрать переопределенный оператор в строке 21 т.к. возвращаем тип инт, принимаем структуры.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.06.2020, 13:51
Цитата Сообщение от Palich Посмотреть сообщение
L-значение инт
Перегрузка не выбирается по возвращаемому значению.
Зачем вы гадаете? Найдите учебник, который я вам выше посоветовал. Там все нормально написано.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.06.2020, 18:43
Цитата Сообщение от Palich Посмотреть сообщение
По твоему вопросу: возвращает нестандартный тип вида структуры.
Правильно. А оператора приведения к инту у этого кастомного типа нет. Поэтому в инт он и не пролезет.

Добавлено через 4 минуты
Цитата Сообщение от Palich Посмотреть сообщение
дальше ищет подходящий переопределенный оператор
Прваильно. Два кандидата - один который с const и и возвращает int второй который без const и возвращает ComplexStruct. фактические аргументы неконстантные поэтому без const конверсий меньше его и выбирает. Соответственно возвращает ComplexStruct а не int. Кста эт основная причина const делать всем ссылкам изменение которых не планируется - в него и константные и неконстантные фактические аргументы пролезут. Т.е. первую перегрузку которая без const надо убрать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2020, 18:43

Почему можно переопределять переменную в цикле?
привет. Привожу листинг из учебника. Это есть програмка для вывода меню на экран. Ненужные куски кода убрал. // ... int main() {...

Модификатор, позволяющий у классов-потомков переопределять методы
Господа из МэйлРуГруп..........горите в аду :) Модификатор, позволяющий у классов-потомков переопределять методы как ответить на...

Почему нужно переопределять метод, для использования ?
Всем привет есть такой код : class A { private: int var; public: A() { var = 0 } int getVar() { ...

Зачем переопределять методы ToString(), GetHashCode(), Equals()
В голове не укладывается. Зачем это на практике нужно?

Обязательно ли переопределять виртуальный метод в дочернем классе?
Вопрос: если в родительском классе определен и реализован виртуальный метод, обязательно переопределять его в дочернем? class OneTwo { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru