2016-11-23 6 views
2
#include <iostream> 
using namespace std; 
class A 
{ 
    int x; 
public: 

    A(int a) 
    { 
     x = a; 
     cout << "CTOR CALLED"; 
    } 
    A(A &t) 
    { 
     cout << "COPY CTOR CALLED"; 
    } 
    void display() 
    { 
     cout << "Random stuff"; 
    } 
    A operator = (A &d) 
    { 
     d.x = x; 
     cout << "Assignment operator called"; 
     return *this; 
    } 
}; 

int main() 
{ 
    A a(3), b(4); 
    a = b; 
    return 0; 
} 

Выход этого кода:Почему здесь вызывается конструктор копирования?

CTOR НАЗВАЛ
CTOR НАЗВАЛ
Оператор присваивания называется
COPY CTOR НАЗВАЛ

Когда я использовал часы в визуальной студии он показал что значение x в a было изменено еще до вызова перегруженного оператора присваивания.

Итак, почему конструктор копирования даже называется здесь?

ответ

3

Как @SomeProgrammerDude уже сказал, это потому, что вы возвращаете по значению, а не по ссылке, как вы обычно делаете с оператором присваивания. Я хотел бы добавить, что ваш оператор присваивания в настоящее время неправильный путь вокруг:

A operator = (A &d) 
{ 
    d.x = x; 
    cout << "Assignment operator called"; 
    return *this; 
} 

Обычно вы передаете d по константной ссылке, потому что мы хотим изменить членов this. Вы меняете членов d. Который бы функционально превратил ваш a = b; в b = a;, так как a = b; на данный момент изменил команду b.

Изготовление d a const& предотвращает эти ошибки.

Вы должны изменить его на:

A& operator = (A const &d) 
{ 
    x = d.x; 
    cout << "Assignment operator called"; 
    return *this; 
} 
6

Потому что вы возвращаете по значению от оператора присваивания. Она должна возвращать ссылку:

A& operator = (A &d) { ... } 
+6

Просто примечание параметр должен быть константными исми 'и оператором = (Константным & d) {...}' То же самый для конструктора копирования. –

+3

И вы хотите скопировать значение 'x' другим способом. То есть 'x = d.x;' –

Смежные вопросы