Ваша основная переменная тела - std::string
.
Ваша переменная параметра const std::string&
.
Константа в ссылках всегда является "низкоуровневой константой", то есть она изменяет тип объекта, а не фактический объект.
Напротив, «верхний уровень const» изменяет реальный объект. Прочитайте C ++ Primer на верхнем уровне const для уточнения.
Вот как выглядит ваше назначение при передаче аргументов:
const std::string& = std::str; //Values are ommited
// i.e const std::string newStr = std::string str
Вы инициализируете const type reference
с non-const value
, что является приемлемым. Вы не должны изменять значение std::string str
, используя эту ссылку. И, если вы попытаетесь изменить значение newStr
внутри конструктора, вы получите ошибку компиляции .
Затем вы делаете другое назначение внутри конструктора, что также приемлемо:
std::string = const std::string
Тот факт, что wrap.str[0]
не изменил str
из main
, заключается в том, что хотя ссылка использовалась для создания экземпляра class str
, class str
имеет собственный объект и не связана с main str
. Использование этой ссылки в параметре просто связывает этот параметр с main str
; не main str
до class str
.
Если бы на ваши переменные класса ссылались, то это могло бы измениться.