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

Прошу объяснить первую строку

31.12.2016, 01:20. Показов 542. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я прохожу на данный момент перегрузку операторов, в общем по теоретическому материалу я сейчас перегружаю оператор + в классе, чтобы он мог складывать значения одногго объекта с другим. Вот здесь полный код программы
Кликните здесь для просмотра всего текста

Хотел уточнить что делает данный код, мои вопросы будут в виде комментариев
C++
1
2
3
4
5
6
7
8
9
// с помощью области видимости показываем что функция принадлежит классу?
three_d three_d::operator+(three_d t)
{
    three_d temp; //
    temp.x = x + t.x;
    temp.у = y + t.y;
    temp.z = z + t.z;
    return temp; // здесь уже возвращается объект класса temp с новыми значениями?
}
Я так понял что данная функция создает новый объект temp с типом класса и потом просто этот объект как бы существует сам по себе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.12.2016, 01:20
Ответы с готовыми решениями:

Прошу объяснить о ссылках,указателях,стрелке -> и двоеточиях :: очень прошу я не понял синтаксис
Здравствуйте! Есть конкретно 4 типа: 1)стрелка (->) 2)указатели (*) 3)ссылки (&) 4)2е двоеточий (::) а вопрос:что они собой...

Прошу объяснить код С++
здравствуйте, прошу объяснить как для полного нуба простейшими словами данный кусок кода: y=150 (10010110 в двоичной) int y=150; ...

Прошу объяснить ввод символов
Дело касается самых основ, но что-то ускользнуло от моего понимания. #include <iostream> using namespace std; int main() { ...

4
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.12.2016, 05:33
three_d three_d::operator+(three_d t) three_d three_d::operator+(const three_d& t)const . Также поправить объявление оператора в классе. А то, не аккуратненько.
Цитата Сообщение от FishZone Посмотреть сообщение
с помощью области видимости показываем что функция принадлежит классу?
Да. Надо же как-то понять от какого класса этот operator+.
Цитата Сообщение от FishZone Посмотреть сообщение
Я так понял что данная функция создает новый объект temp с типом класса и потом просто этот объект как бы существует сам по себе?
После return существует уже не temp, а его копия в безымянном временном объекте. Ну или оптимизатор немного пошаманит и temp сразу будет псевдонимом временного объекта, не суть. Сам объект в свою очередь живет ровно до конца выражения в котором вы задействовали конструкцию вида a+b.
2
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
31.12.2016, 06:03
FishZone, давайте разберемся
C++
1
three_d three_d::operator+(three_d t)
разделим первую строку вот так
1.То что возвращаем
2.Область видимости
3.Спец синтаксис перегрузки

1.По поводу того что возвращаем, мы возвращаем копию объекта класса, но не копию нашего объекта, а уже копию того что мы создадим в операторе и сложим его с другим т.е.

a + b

здесь к (а) прибавится (b) и это по сути будет что то типа
C++
1
2
3
4
someType sum(const someType& a, const someType& b) {
    someType c = a + b;
    return c;
}
для чего возвращать копию, во первых чтобы вы могли писать вот такие длинные конструкции
a + b + c + d etc.
и во вторых после сложения вы хотите использовать присваивание как обычно т.е.
a = a + b
но для чего же это делается
например можно сделать вот так :
C++
1
2
3
4
5
6
void three_d::operator+(const three_d& t)
{
    x += t.x;
    y += t.y;
    z += t.z;
}
в данном случае мы будем сразу изменять объект (а) но тут появляются две проблемы, нельзя писать длинные выражения
a + b + c
и получается синтаксический сахар потому что
a + b
уже поменяет объект a при такой реализации данного оператора и использование a = бесполезно

2.Касательно второго пункта, это мы уточняем область видимости, что бы сказать что мы перегружаем оператор + именно в этом классе, советую еще посмотреть вам синтаксис "глобальной перегрузки" определение кривоватое, но думаю меня поправят форумчане подкованные в терминологии.

3.Вот тут просто то что стоит запоминать, для разных операторов данный синтаксис может быть разным, в зависимости бинарный ли это или унарный оператор, а также пару исключений, но везде вы увидете конструкцию
operator(вот тут сам оператор +,-,*,\ и т.д.)(список аргументов, может быть, а может не быть)
касательно списка аргументов всегда есть у бинарных перегрузок, и обычно пуст для унарных
бинарные перегрузки это
+, -, *, \, ==, и все краткие формы записи += и т.д.
унарные
+, - (это унарный + и - не путать со сложением и вычитанием) потом ++, -- и т.д.

вот вам пример таких перегрузок
C++
1
2
3
4
5
6
7
8
9
10
11
Type Type::operator+(const Type& right) const  { //пример перегрузки в классе
    Type tmp;
    //тут реализация сложения того как вы задумаете
    return tmp;
}
 
Type operator+(const Type& left, const Type& right) { // вот это так мною называемая глобальная перегрузка
    Type tmp;
    //тут реализация сложения того как вы задумаете 
    return tmp;
}
а вот пример унарной перегрузки
C++
1
2
3
4
5
6
7
8
9
const Type& Type::operator++(void) { //пример перегрузки в классе
    //реализация инкремента так как задумаете
    return obj;
}
 
const Type& operator++(Type& obj) { //пример глобальной перегрузки
    //реализация инкремента так как задумаете
    return obj;
}
В целом это все, надеюсь помог, конечно есть пару нюансов, допустим по поводу постпрефиксной и префиксной перегрузок, перегрузки допустим () для объекта класса, что может приврать объект класса в функтор, но это уже на самостоятельное изучение

Добавлено через 2 минуты
Если что, рекомендую почитать вот эту статейку на хабре

Добавлено через 4 минуты

Не по теме:

Renji, долговато писал свой пост не видел что ответили :)

1
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
02.01.2017, 18:45  [ТС]
Ого, ничего себе вы понаписали) Спасибо большое!) Вроде разобрался.

Добавлено через 1 час 16 минут
Цитата Сообщение от Renji Посмотреть сообщение
three_d three_d::operator+(const three_d& t)const
Правильно понимаю, что эта запись означает что в параметры функции-оператора будет передаваться ссылка на константные неизменяемые объекты из объекта класса t? А после скобок мы показываем что перегруженный оператор не будет изменять также в самом классе операнды которые мы будем использовать?

То есть будет создаваться временный объект, который мы позже можем уничтожить деструктором?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.01.2017, 21:11
Цитата Сообщение от FishZone Посмотреть сообщение
Правильно понимаю, что эта запись означает что в параметры функции-оператора будет передаваться ссылка на константные неизменяемые объекты из объекта класса t? А после скобок мы показываем что перегруженный оператор не будет изменять также в самом классе операнды которые мы будем использовать?
Да. В метод уедет константная ссылка, самому методу будет запрещено изменять объект его класса.
Цитата Сообщение от FishZone Посмотреть сообщение
То есть будет создаваться временный объект, который мы позже можем уничтожить деструктором?
Да. Хотя, оптимизатор может изменить код так, что временный объект будет не копироваться в принимающий буфер и затем удаляться, а сразу создаваться в этом буфере. А может и не изменить, так что лучше на это не полагаться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2017, 21:11
Помогаю со студенческими работами здесь

Прошу объяснить смысл оператора int**
Встретил в чужом коде следующй оператор: int** вот в таком контексте: (динамическое распределение памяти): int** m = new int*; ...

Прошу объяснить работу готовой программы
Что требуется: При описании решения задачи следует отдельно выделить постановку задачи с указанием входных и выходных данных и метод...

непонятная для меня ошибка прошу объяснить знающих людей
Я обращаюсь с проблемой во вроде бы рабочей программе. Задача была построить программу с сортировкой массивов методами пузырька и шейкера....

Матрицы: поменять местами первую строку и строку, содержащую максимальный элемент
1)В матрице поменять местами 1 строку и строку содержащие последнее вхождение элемента максимального где максимальный- максимальный элем...

Поменять местами первую строку и строку сумма элементов которой минимальна
Дан двумерный массив размера NxM. Поменять местами первую строку и строку сумма элементов которой минимальна. Вывести полученную матрицу на...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru