Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185

Перегруженный оператор присваивания

24.06.2015, 22:52. Показов 1282. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - "в каком месте кода описывается то, что other является вторым аргументом оператора присваивания, собственно он является тем списком, который мы копируем в текущий список (это как вроде this)".
Этот код для однонаправленного кольцевого списка. Суть кода такова, что есть текущий список (this) и список, который мы копируем в текущий (other). В случае, когда у текущего списка будет больше элементов чем, в копируемом, то лишние элементы удаляются.
C++
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
CircleList<DataType>& operator=(CircleList<DataType>& other) {
        if(other.lastNode != NULL) {
            Node<DataType>* iterator = other.lastNode->nextNode;
            Node<DataType>* prevNode;
            if(this->lastNode == NULL) {
                this->mergeWithList(iterator, other);
            } else {
                Node<DataType>* thisIterator = this->lastNode->nextNode;
                do {
                    thisIterator->data = iterator->data;
                    prevNode = iterator;
                    iterator = iterator->nextNode;
                    thisIterator = thisIterator->nextNode;
                } while(iterator != other.lastNode->nextNode && thisIterator != this->lastNode->nextNode);
 
                if(thisIterator != this->lastNode->nextNode) {
                    Node<DataType>* buffer;
                    thisIterator = thisIterator->nextNode;
                    do {
                        buffer = thisIterator->nextNode;
                        delete thisIterator;
                        thisIterator = buffer;
                    } while(thisIterator != this->lastNode->nextNode);
                    this->lastNode = prevNode;
                } else if(iterator != other.lastNode->nextNode) {
                    this->mergeWithList(iterator, other);
                }
            }
        } else {
            this->purge();
        }
        return *this;
  }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2015, 22:52
Ответы с готовыми решениями:

Перегруженный оператор присваивания
Добрый вечер! Встретил пример в книге, где есть перегруженный оператор присваивания. В итоге код который написан в книге не запускается. Во...

Не работает перегруженный оператор присваивания
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Windows.h&gt; class OutOfBoundsException {}; class MyString { private: unsigned...

Не выполняется перегруженный оператор присваивания
Подскажите пожалуйста, почему ругается компилятор? Я только начал изучать С++ по книге Шилдта, и там написана вот эта программа. В 93...

17
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2015, 23:29
И в чем ваш вопрос?
this это указатель на объект для которого вызывается метод и неявно передается в любой метод, по этой причине other - второй аргумент.
1
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
24.06.2015, 23:43  [ТС]
OstapBender, вопрос в том, как мне обьяснить человеку по коду или словесно, что other обязательно будет тем самым вторым аргументом (то есть копируемым списком).
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2015, 23:59
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, вопрос в том, как мне объяснить человеку по коду или словесно, что other обязательно будет тем самым вторым аргументом (то есть копируемым списком).
ну, для начала, вторым аргументом может быть что угодно, не обязательно экземпляр того же класса.
продемонстрировать же визуально "тот самый" первый аргумент this не предоставляется возможным, но можно показать, что перегрузка через внешнюю либо дружественную функцию невозможна - это одно из требований к оператору присваивания. а для любого метода this неявно передается как первый аргумент, это описывается в стандарте.
1
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:03  [ТС]
OstapBender, а по коду моему это следует из первой строчки или как?
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
25.06.2015, 00:10
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, а по коду моему это следует из первой строчки или как?
Это следует из свойства перегрузки оператора присваивания...
0
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:12  [ТС]
OstapBender, с меня просто требовали указать это в коде, поэтому я уже сам запутался , что к чему.
По данному коду вы можете точно указать строку, где указывается это?
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
25.06.2015, 00:21
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, с меня просто требовали указать это в коде, поэтому я уже сам запутался , что к чему.
По данному коду вы можете точно указать строку, где указывается это?
Это нигде не "указывается", это факт и данность.
Но если вам так угодно, то в коде видно, что вы используете this->... который нигде не объявляется а "неявно передается в любой метод", он то и есть тот самый первый аргумент.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2015, 00:45
Цитата Сообщение от levgen Посмотреть сообщение
но не до конца понимаю суть данного вопроса - "в каком месте кода описывается то, что other является вторым аргументом оператора присваивания,
ни в каком.
other не является вторым аргументом оператора присвоения.
он является единственным аргументом присвоения.

пример:

http://rextester.com/KDV21108

C++
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
#include <iostream>
 
struct data{};
 
struct example{
    
    
    void work(const data& rhs) const
        { std::cout<<"work\n"; }
    
    const example& operator=(const data& rhs) 
        {
            std::cout<<"assignment operator\n";
            return *this;
        }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    example ex;
    data d;
    
    // запись вида:
    ex = d;
    
    // на самом деле не более, чем синтаксический сахар
    // а сам const example& example::operator=(const data& rhs)
    // на самом деле является самой обычной обычной функций-членом класса
    // и подчиняется тем же правилам, что и остальные функции-члены класса
    
    
    // как видите, ничем не отличается от обычной функции-члена   
    ex.work(d);
    ex.operator=(d);
    
    // как видите, оператор= принимает 1 единственный аргумент
    // как и любая другая функция-член с единственным параметром
    
}
единственное, и главное отличие оператор=,
которое отличает его от прочих операторов или функций:
его нельзя перегрузить глобально.
1
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:53  [ТС]
hoggy, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2015, 01:02
Цитата Сообщение от levgen Посмотреть сообщение
hoggy, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
да
но сам оператор - бинарный.

тобишь, в операции присвоения всегда участвует два операнда
(не путать операнд и аргумент).

в качестве левостоящего операнда выступает объект, чем оператор= был запущен.
в качестве правостоящего операнда выступает ваш other.
1
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.06.2015, 01:06
Цитата Сообщение от levgen Посмотреть сообщение
, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
Ошибаетесь. Это второй аргумент. Поскольку оператор - метод класса, то имеется неявный аргумент this. Он автоматически генерируется компилятором.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2015, 01:21
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ошибаетесь. Это второй аргумент. Поскольку оператор - метод класса, то имеется неявный аргумент this. Он автоматически генерируется компилятором.
Вы ошибаетесь.

1.
Стандарт ничего не говорит по поводу передачи скрытого this.
И оставляет это не откуп компиляторов.

2.
Соглашения о вызовах не являются частью стандарта.
Более того, невзирая на соглашение о вызове,
компилятор вправе оптимизировать передачу скрытого аргумента this.

Именно по-этой причине,
компиляторы не дают просто так кастить указатель на функцию-член,
к свободной функции.

Потому что программист в общем случае не может закладываться на то,
как именно будет передана информация об адресе объекта для которого запускается функция-член.

И попытки обойти защиту компилятора - это хак на свой страх и риск.


3.
Соглашения о вызовах случаются разными.
И технически нет никаких препятствий для того,
что бы передавать this, например, всегда последним аргументов, либо как то ещё.

Поэтому, несмотря на то, что обычно он - первый,
нельзя сказать, что он всегда и априори будет первым аргументом.

4.
Так или иначе, но это - кухня компилятора, а не часть языка.

Формально, с точки зрения правил языка,
никакого скрытого аргумента не существует.
Существует ровно то, что написал программист.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.06.2015, 01:55
Цитата Сообщение от hoggy Посмотреть сообщение
Вы ошибаетесь.
Фактически как бы он не передавался он существует.
Хотя бы потому что в скопе метода существует this.

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

CircleList<DataType>& CircleList<DataType>::operator=(CircleList<DataType>& other)

Ото что выделено жирным фактически и есть объявлением параметра this.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2015, 01:58
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Фактически как бы он не передавался он существует.
Хотя бы потому что в скопе метода существует this.
не факт.
оптимизации. он может пройти через регистры, например.

или какой нибудь шибко умный компилятор догадается,
что в программе один единственный экземпляр (какой нибудь сингелтон),
и вообще весь метод сделает inline, включая адрес объекта.

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ото что выделено жирным фактически и есть объявлением параметра this.
жирным выделено имя класса, которому принадлежит функция-член.

для того, что бы объявить указатель this нужно написать ключевое слово this.
никакого другого объявления для указателя this не существует.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.06.2015, 02:02
Цитата Сообщение от hoggy Посмотреть сообщение
жирным выделено имя класса, которому принадлежит функция-член.
для того, что бы объявить указатель this нужно написать ключевое слово this.
никакого объявления для указателя this не существует.
Правильно. А соответственно и есть указание компилятору добавить в функцию скрытый параметр CircleList<DataType> *this и передавать его автоматически, каким бы там методом передачи он не пользовался.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.06.2015, 02:03
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А соответственно и есть указание компилятору добавить в функцию скрытый параметр CircleList<DataType> *this и передавать его автоматически, каким бы там методом передачи он не пользовался.
бред.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.06.2015, 02:06
Цитата Сообщение от hoggy Посмотреть сообщение
бред.
Когда на досуге займетесь написанием компилятора то поймете что именно так оно и есть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2015, 02:06
Помогаю со студенческими работами здесь

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element; Node *pNext; };

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания?
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp; some_class::operator=(const some_class&amp;...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Перегруженный оператор +
Здравствуйте. Нужно разобраться как работает перегруз операторов. Я взял оператор + и пытаюсь сделать плюсик, который складывает массивы: ...

Перегруженный оператор +
Товарищи программисты не могу понять вот этот кусок кода: dist4 = dist1 + dist2 + dist3; у нас есть конструктор с двумя параметрами, но...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru