У меня есть следующая структура:
class Test {
public:
int k = 10;
};
class SecondTest {
private:
Test t;
public:
const Test& myTest() {
return t;
}
};
int main()
{
SecondTest secondTest;
Test tt = secondTest.myTest();
tt.k = 20;
cout << "tt.k value: " << tt.k;
}
Я думал так:
const Test& myTest() {
Сделает возвращаемое значение константным.
Но нет, я могу просто присвоить неконстантное значение и использовать его как неконстантный материал:
Test tt = secondTest.myTest();
Результат печати будет
"tt.k value: 20"
Это звучит так странно для меня... я что-то упускаю из виду?
О, хорошо, это концепция, которую я упустил, в других языках возврат был бы ссылкой, но здесь по значению.
Наберите Test& tt = secondTest.myTest(); и вы увидите разницу
Вещь, возвращаемая из функции, ЯВЛЯЕТСЯ ссылкой. упомянутая вещь затем используется для копирования конструкции tt
Test tt = secondTest.myTest();
делает копию возвращаемой ссылки const. И вы не сделали копию const.
Test tt = secondTest.myTest()
Функция возвращает ссылку на константный объект. Этот объект нельзя изменить.
Но часть Test tt = ... запускает конструктор копирования, который создает копию. Эту копию можно изменить.
Вы написали
Test& tt = secondTest.myTest()
Это копия, а не оригинал