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

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

31.12.2016, 01:20. Показов 525. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru