![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
igor_bogomolov |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Вопрос из теста.
Раскрывающийся текст
Вопрос в тесте такой - сколько раз вызовется конструктор класса A при исполнении функции main. После ответа откомпилируй код для проверки, добавив какой-нибудь std::cout в конструктор A. При первом просмотре (да и при втором, третьем, ...) я предположил, что конструктор вызовится 4 раза. Откомпилировав, получил всего два вызова. Пробовал воспользоваться отладчиком и впал в недоумение. r1 и r2 вообще не создаются, т.е. при компиляции эти строчки игнорируются. Сделал m_name публичным и попробовал обратиться к нему после создания r1. Получил ошибку компиляции Цитата ошибка: запрос элемента ‘m_name’ в ‘r1’, имеющего не классовый тип ‘A(std::string)’ При этом r3 и r4 создаются нормально и обращение к m_name не приводит к ошибке.Помогите разобраться что происходит |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён)
строчки A r1(std::string(v[1])); и A r3(s); проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы. Можно вывести их значение в поток тоже, чтобы они "остались", либо отрубить оптимизацию (а в дебаге должно само остаться, кстати) Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной. Ну ну ![]() [offtop] A r1(std::string(v[1])); может рассматриваться как функция A r1(std::string) с параметром по умолчанию v[1] и т. д. а если бы это и было прототипом, то синтаксис неверен - какой ещё тут параметр по умолчанию ? ![]() [/offtop] Что значит нельзя? ты объявил не функцию, сделал предопределение глобальной функции foo ИМХО
Хотя, студия, к примеру, не позволила бы сделать это внутри функции )) Сообщение отредактировал Алексей1153 - 14.7.2010, 7:56 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 24.6.2025, 1:52 |