2016-05-26 5 views
-1

MWE являетсяПереприсвоить значение не работает в операторе = перегрузка

#include <iostream> 

using namespace std; 

class N { 
public: 
    float x; 
    N() { x = 0.0; } 
    N(float a) { x = a; } 
    //N(N &n) { x = n.x; } 
    N &operator=(float f) { cout << "########";return *new N(f); } 
}; 



int main() { 
    N a; 
    a = 3.0; 
    cout << a.x; 
    return 0; 
} 

Что я ожидаю: она печатает 3, но на самом деле выводит 0. Кажется значение не изменилось.

Тогда я изменить его в

x = f; return *this; 

Он работал, почему?

+2

Если вы читаете, что 'operator =' должен возвращать ссылку на новый объект, прочитайте что-нибудь еще. – user463035818

+1

В качестве оценки задания возвращается '* new N (f)'. 'cout << (a = 0.3) .x' возвращает 3.0 при обращении к выражению, возвращаемому назначением. –

ответ

3

Конечно, это не меняется. Вы не изменяете его в своем операторе назначения. Вместо этого вы возвращаете указатель на новое значение, выделенное в куче ... и игнорируете этот результат.

+2

Утечка памяти - это бонус, я полагаю. – WhozCraig

+0

Да, я возвращаю указатель на новое значение, выделенное в куче. Но почему результат был проигнорирован? 'a' получить новый указатель. Конечно, 'a.x' изменится, не так ли? – yuxuan

+0

№ a. * Не * получить новый указатель. а не изменился. Существует новая структура в куче с новым значением. Подсказка: C++ не является Java или C# –