Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
1

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

24.06.2015, 22:52. Просмотров 640. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2015, 22:52
Ответы с готовыми решениями:

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

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

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

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

17
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2015, 23:29 2
И в чем ваш вопрос?
this это указатель на объект для которого вызывается метод и неявно передается в любой метод, по этой причине other - второй аргумент.
1
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
24.06.2015, 23:43  [ТС] 3
OstapBender, вопрос в том, как мне обьяснить человеку по коду или словесно, что other обязательно будет тем самым вторым аргументом (то есть копируемым списком).
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2015, 23:59 4
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, вопрос в том, как мне объяснить человеку по коду или словесно, что other обязательно будет тем самым вторым аргументом (то есть копируемым списком).
ну, для начала, вторым аргументом может быть что угодно, не обязательно экземпляр того же класса.
продемонстрировать же визуально "тот самый" первый аргумент this не предоставляется возможным, но можно показать, что перегрузка через внешнюю либо дружественную функцию невозможна - это одно из требований к оператору присваивания. а для любого метода this неявно передается как первый аргумент, это описывается в стандарте.
1
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:03  [ТС] 5
OstapBender, а по коду моему это следует из первой строчки или как?
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
25.06.2015, 00:10 6
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, а по коду моему это следует из первой строчки или как?
Это следует из свойства перегрузки оператора присваивания...
0
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:12  [ТС] 7
OstapBender, с меня просто требовали указать это в коде, поэтому я уже сам запутался , что к чему.
По данному коду вы можете точно указать строку, где указывается это?
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
25.06.2015, 00:21 8
Цитата Сообщение от levgen Посмотреть сообщение
OstapBender, с меня просто требовали указать это в коде, поэтому я уже сам запутался , что к чему.
По данному коду вы можете точно указать строку, где указывается это?
Это нигде не "указывается", это факт и данность.
Но если вам так угодно, то в коде видно, что вы используете this->... который нигде не объявляется а "неявно передается в любой метод", он то и есть тот самый первый аргумент.
0
Эксперт С++
8178 / 3775 / 815
Регистрация: 15.11.2014
Сообщений: 8,586
25.06.2015, 00:45 9
Цитата Сообщение от 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
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
25.06.2015, 00:53  [ТС] 10
hoggy, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
0
Эксперт С++
8178 / 3775 / 815
Регистрация: 15.11.2014
Сообщений: 8,586
25.06.2015, 01:02 11
Цитата Сообщение от levgen Посмотреть сообщение
hoggy, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
да
но сам оператор - бинарный.

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

в качестве левостоящего операнда выступает объект, чем оператор= был запущен.
в качестве правостоящего операнда выступает ваш other.
1
2045 / 1518 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
25.06.2015, 01:06 12
Цитата Сообщение от levgen Посмотреть сообщение
, хорошо other это единственный аргумент оператора присваивания. Исходя из первой строчки, т.к. он идет после записи operator=
Ошибаетесь. Это второй аргумент. Поскольку оператор - метод класса, то имеется неявный аргумент this. Он автоматически генерируется компилятором.
0
Эксперт С++
8178 / 3775 / 815
Регистрация: 15.11.2014
Сообщений: 8,586
25.06.2015, 01:21 13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ошибаетесь. Это второй аргумент. Поскольку оператор - метод класса, то имеется неявный аргумент this. Он автоматически генерируется компилятором.
Вы ошибаетесь.

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

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

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

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

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


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

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

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

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

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

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

Ото что выделено жирным фактически и есть объявлением параметра this.
0
Эксперт С++
8178 / 3775 / 815
Регистрация: 15.11.2014
Сообщений: 8,586
25.06.2015, 01:58 15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Фактически как бы он не передавался он существует.
Хотя бы потому что в скопе метода существует this.
не факт.
оптимизации. он может пройти через регистры, например.

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

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

для того, что бы объявить указатель this нужно написать ключевое слово this.
никакого другого объявления для указателя this не существует.
0
2045 / 1518 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
25.06.2015, 02:02 16
Цитата Сообщение от hoggy Посмотреть сообщение
жирным выделено имя класса, которому принадлежит функция-член.
для того, что бы объявить указатель this нужно написать ключевое слово this.
никакого объявления для указателя this не существует.
Правильно. А соответственно и есть указание компилятору добавить в функцию скрытый параметр CircleList<DataType> *this и передавать его автоматически, каким бы там методом передачи он не пользовался.
0
Эксперт С++
8178 / 3775 / 815
Регистрация: 15.11.2014
Сообщений: 8,586
25.06.2015, 02:03 17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А соответственно и есть указание компилятору добавить в функцию скрытый параметр CircleList<DataType> *this и передавать его автоматически, каким бы там методом передачи он не пользовался.
бред.
0
2045 / 1518 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
25.06.2015, 02:06 18
Цитата Сообщение от hoggy Посмотреть сообщение
бред.
Когда на досуге займетесь написанием компилятора то поймете что именно так оно и есть
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2015, 02:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.