Оператор присваивания строки C++
Я просматриваю некоторый код для оператора присваивания строкового класса, и есть некоторые понятия, которые я не понимаю.
1) Аргумент является константой, но значение в конечном итоге меняется, я думал, что константы не могут быть изменены?
2) Вы передаете адрес строкового аргумента, а затем в операторе if вы снова получаете доступ к адресу, не могли бы вы пропустить Ampersand, так как к адресу уже следует обращаться, просто используя "right"?
String& String::operator=(const String& right) //why is const passed is a new value gets assigned?
{
if (this != &right) // Cant this be if(this != right)
{
delete[] buffer; // Get rid of old buffer len = right.length();
buffer = new char[len + 1];
for (int i = 0; i < len; i++)
buffer[i] = right[i];
buffer[len] = '\0';
}
return *this;
}
4 ответа
Пожалуйста, оставьте отдельный вопрос в будущем.
В (1) вы путаете две стороны задания. Правая сторона постоянна. a=b
определенно не меняется б.
(2) Вы передаете выражение, а не адрес. right
является ссылкой на это выражение. this
с другой стороны это указатель. Проверьте свою книгу, это базовый C++.
При вызове оператора присваивания для двух строк, A и B, например, A=B, строка B передается как константная ссылка. Строка A - это то, что изменяется.
В строке this!= & Right мы сравниваем это (указатель на строку на LHS знака =) с &right (адрес строки на RHS знака равенства). Не имеет смысла сравнивать указатель со строкой, как если бы мы использовали это! = Right.
1) Вы передаете константную ссылку, это означает, что вы не можете изменить right
аргумент, но вы можете изменить содержимое this
,
2) this
это указатель right
это ссылка. Они не одинаковы, и поэтому вы не можете сравнивать напрямую. Вы можете получить адрес ссылки, используя &right
,
Строка передается как константная ссылка, а не как константный указатель. Следовательно, проверка должна быть this != &right
чтобы получить сравнение указатель-указатель.