структуры string Name. Указал только то, что в int main(). Вот этот код:
Container C_Sam = { "Sam", 4,5,6 };
Container* C_SamPtr = &C_Sam;
cout << C_Sam.Name << endl;
cout << C_SamPtr->Name << endl;
Я ведь правильно понимаю, что в первом случаем будет создание временной копии объекта структуры и вывод члена-имени на экран? А во втором только вызов указателем конкретной переменной Name, не трогая остальные компоненты контейнера?
И еще, если я удалю строку
Container* C_SamPtr = &C_Sam;
то могу ли я совершить вызов переменной контейнера через указатель способом, показанным ниже?
cout << *&C_Sam.Name << endl;
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Container* C_SamPtr = &C_Sam; cout << C_Sam.Name << endl; //(1) cout << C_SamPtr->Name << endl; //(2) (1) и (2) полностью эквивалентны
Результат будет эквивалентен. Но сам способ его получения, разве он одинаков? Ведь во втором случае используется указатель
С языковой точки зрения компилятор может преобразовать конструкцию (2) в то же самое, что (1) в этом примере
Да, заметьте, что объект C_Sam "трогается" только в смысле того, что с языковой точки зрения C_Sam должна быть переменной нужного типа во время её жизни; в реализации само по себе "вычисление" C_Sam.Name это будет простейшая арифметическая операция вычисления адреса поля Name по известному адресу C_Sam
А что имеется ввиду под вызовом всего контейнера?
не совсем верно написал. Вызов всего объекта структуры. Так будет правильнее
А что Вы имейте ввиду под вызовом?
создание временной копии
На самом деле вызывается одна и та же перегрузка, просто в случае с указателем через нативный -> происходит разыменование указателя на поле name, которое, выведется в ссылку в аргументе шаблонной функции, как и в случае передачи по значению. А за кулисами << может быть копирование в буфер выходного потока. Но сам объект не копируется, ибо мы явно указали нужное нам поле
Обсуждают сегодня