Чтобы лучше понять работу объектов в С++, я написал этот фрагмент кода:
using namespace std;
char n[] = "\n";
class T
{
private:
int num;
public:
T ()
{
num = 0;
cout << n << (long)this % 0xFF << " created without param";
}
T (const int param)
{
num = param;
cout << n << (long)this % 0xFF << " created with param = " << param;
}
T (const T& obj)
{
num = obj.num;
cout << n << (long)this % 0xFF << " created as copy of " << (long)&obj % 0xFF;
}
const T& operator= (const T& obj)
{
if (this == &obj)
return *this;
num = obj.num;
cout << n << (long)this % 0xFF << " got assigned the data of " << (long)&obj % 0xFF;
return *this;
}
~T ()
{
cout << n << (long)this % 0xFF << " destroyed";
}
int get () const {return num;}
void set (const int param) {num = param;}
};
T PlusTen (T obj)
{
T newObj(5);
newObj.set( obj.get() +10 );
return newObj;
}
int main ()
{
T a, b(4);
a = b;
a = PlusTen(b);
cout << n;
return 0;
}
Он работает нормально, но когда я удаляю квалификатор const
в «типе возврата» и «параметре» перегруженного оператора присваивания, как показано ниже:
T& operator= (T& obj) // const removed
{
if (this == &obj)
return *this;
num = obj.num;
cout << n << (long)this % 0xFF << " got assigned the data of " << (long)&obj % 0xFF;
return *this;
}
Затем эта строка основной функции дает ошибку:
a = PlusTen(b);
Сообщение об ошибке:
no match for 'operator=' (operand types are 'T' and 'T')
note:
candidate is: T& T::operator=(T&)
no known conversion for argument 1 from 'T' to 'T&'
Если типы операндов 'T' и 'T' проблематичны, то почему строка над ними (a = b;
) полностью исправна? Они тоже имеют типы операндов 'T' и 'T' !!
Я нашел здесь соответствующий вопрос, но не нашел там полезной информации:
почему вы должны указывать ключевое слово const в перегрузках операторов
Один человек говорит, что если мы не используем const
в operator=, мы можем использовать его только для non-const
объектов. Но и в моем случае обе стороны неконстантны. Тогда почему ошибка? Особенно, когда строка над ней, идентичная по типам операндов, компилируется нормально?
Используемый компилятор: MinGW