перегрузка оператора присвоения пропущена / не происходит - PullRequest
1 голос
/ 04 марта 2011

Я пытаюсь создать библиотеку для некоторой работы и использую перегрузку оператора для операции присваивания.Предположим, X и Y - два экземпляра класса, который перегружен таким образом:

A& A::operator=(A &rhs)
{
    A::assign(*this, rhs);
    return *this;
}

Когда я делаю это:

A z;
z = x + y; // x and y are other instances of class A

все нормально, однако, когда я делаю `

A p = q + r;

перегруженная процедура не вызывается.Я не очень опытен с перегрузкой операторов, может кто-нибудь объяснить, что происходит.Одним из объяснений может быть то, что p - это просто псевдоним для созданного объекта q + r, однако z создает новый экземпляр класса A, и, следовательно, перегрузка оператора срабатывает, когда z назначается.Вроде как:

#include <iostream>
using namespace std; 
class X
{
    public:
    X();
};

X::X()
{
    cout<<"called"<<endl;
}

int main(int argc, char *argv[]) 
{
    X e; X f;
    X g = e;
}

, где вызванный печатается только дважды, один раз для e и f, и не печатается для g.

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

Если вы объявите переменную и инициализируете ее в той же строке, она все равно вызовет конструктор копирования.

Синтаксис двух инициализаций:

X a;
X b(a);

X a;
X b = a;

Существуют небольшие различияк тому, что они имеют в виду, но в большинстве случаев они делают то же самое.Разница в том, гарантированно ли компилятор избегает определенных конструкций / разрушений.В любом случае будет вызван конструктор копирования, потому что вы создаете объект.Я не могу точно вспомнить, как обстоят дела с разницей в гарантиях.

1 голос
/ 04 марта 2011

случаев, когда вызывается конструктор копирования:

when you return an object
when you pass an object to some function
X b(a);
X b = a;

случаев, когда вызывается функция перегрузки оператора присваивания, это

X b; b=a;//where a is already existing object and already intialised.
1 голос
/ 04 марта 2011

Что происходит,

A p = q + r;

Вызывает конструктор копирования A, а не оператор присваивания. Да это странно Это так же, как если бы вы набрали это:

A p(q + r);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...