2013-03-09 3 views
1

Я просто начинающий на языке C++, и у меня есть некоторые вопросы по этому фрагменту кода. Я пытаюсь перегрузить некоторые операторы.Перегрузка оператора (=)

string& operator = (char R) { string T = R ; *this = T; return *this; } 

Первый вопрос: Почему мне нужно перегрузить равный оператору в то время как конструктор может сделать работу?
Второй вопрос: (не относится) Что означает (char R)?

+0

Во-первых, что такое 'T'? – Rob

+0

Все о перегрузке оператора: http://stackoverflow.com/questions/4421706/operator-overloading – chr

+1

Нет перегрузки оператора в C! –

ответ

2

Первый вопрос: Почему мне нужно перегрузить равный оператору в то время как конструктор может сделать работу?

Конструктор предназначен для «создания» объекта ... в то время как есть что-то, называемое конструктором-копией, оно не предназначено для фактического копирования уже существующего объекта в другой уже существующий объект того же (или конвертируемый) тип ... это задание operator=. Кроме того, вы не «перегружаете» метод operator=, а скорее создаете пользовательскую версию метода, который будет использоваться вместо созданного по умолчанию метода создания компилятора для типа объекта, который просто скопировал бы скопированные биты памяти одного объекта в другой ... если ваш объект управляет своими собственными указателями и т. д., такая копия грубой силы может быть очень плохой, поскольку право собственности на указатель становится неоднозначным и т. д.

+0

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

+0

Правильно, после вызова конструктора и экземпляра объекта, оператор присваивания используется для копий. Имейте в виду [«Правило трех»] (http://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)), хотя ... если вам действительно нужен пользовательский оператор присваивания, тогда вы вероятно, также потребуется определенный пользователем конструктор-копир и деструктор для вашего класса, так как вы, скорее всего, управляете ресурсами, версии компилятора по умолчанию этих методов не будут корректно обрабатываться. – Jason

+0

aha .. Получил целую точку .. большое спасибо :) – geekybedouin

0

(char R) - это правая сторона аргумент оператора (здесь =)

вы хотите, чтобы сделать это, так что вы можете установить значение после инициализации

//constructor 
Foo a('f') 
//copy constructor 
Foo b = Foo('p'); 
// operator= 
b = 'g'; 
0

(char R) - аргумент оператору, так же как и аргумент нормальной функции.

0

Перегрузка оператора на C++. Одна из лучших версий здесь.

http://msumca2012.blogspot.in/2013/03/oop-41-operator-overloading-in-c.html

+0

Добро пожаловать в переполнение стека! Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259) включить основные части ответа здесь и предоставить ссылку для справки. – Emil

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