Возврат const в функцию не делает переменную константой?

У меня есть следующая структура:

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"

Это звучит так странно для меня... я что-то упускаю из виду?

Это копия, а не оригинал

Neil Butterworth 13.02.2023 01:48

О, хорошо, это концепция, которую я упустил, в других языках возврат был бы ссылкой, но здесь по значению.

felipe 13.02.2023 01:51

Наберите Test& tt = secondTest.myTest(); и вы увидите разницу

aleck099 13.02.2023 01:53

Вещь, возвращаемая из функции, ЯВЛЯЕТСЯ ссылкой. упомянутая вещь затем используется для копирования конструкции tt

Neil Butterworth 13.02.2023 02:01
Test tt = secondTest.myTest(); делает копию возвращаемой ссылки const. И вы не сделали копию const.
Drew Dormann 13.02.2023 02:34
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
0
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Test tt = secondTest.myTest()

Функция возвращает ссылку на константный объект. Этот объект нельзя изменить.

Но часть Test tt = ... запускает конструктор копирования, который создает копию. Эту копию можно изменить.

Вы написали

Test& tt = secondTest.myTest()

Другие вопросы по теме