Вопрос по с++, Помогите понять суть |
Здравствуйте, гость ( Вход | Регистрация )
Вопрос по с++, Помогите понять суть |
igor_bogomolov |
13.7.2010, 23:34
Сообщение
#1
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Вопрос из теста.
Раскрывающийся текст
Вопрос в тесте такой - сколько раз вызовется конструктор класса A при исполнении функции main. После ответа откомпилируй код для проверки, добавив какой-нибудь std::cout в конструктор A. При первом просмотре (да и при втором, третьем, ...) я предположил, что конструктор вызовится 4 раза. Откомпилировав, получил всего два вызова. Пробовал воспользоваться отладчиком и впал в недоумение. r1 и r2 вообще не создаются, т.е. при компиляции эти строчки игнорируются. Сделал m_name публичным и попробовал обратиться к нему после создания r1. Получил ошибку компиляции Цитата ошибка: запрос элемента ‘m_name’ в ‘r1’, имеющего не классовый тип ‘A(std::string)’ При этом r3 и r4 создаются нормально и обращение к m_name не приводит к ошибке.Помогите разобраться что происходит |
|
|
DEADHUNT |
14.7.2010, 13:09
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: 2 |
в С++ нельзя функцию объявить внутри другой (например, в main). Поэтому здесь всё однозначно. объявлять можно(declare), определять нельзя(define). в стандарте также упоминается о неоднозначностях c с примерами - 6.8 Ambiguity resolution 8.3.6 Default arguments: .... 5. A default argument expression is implicitly converted (Clause 4) to the parameter type. The default argu- ment expression has the same semantic constraints as the initializer expression in a declaration of a variable of the parameter type, using the copy-initialization semantics (8.5). The names in the expression are bound, and the semantic constraints are checked, at the point where the default argument expression appears. Name lookup and checking of semantic constraints for default arguments in function templates and in mem- ber functions of class templates are performed as described in 14.7.1. [ Example: in the following code, g will be called with the value f(2): с этим загнался. Сообщение отредактировал DEADHUNT - 14.7.2010, 13:17 |
|
|
Текстовая версия | Сейчас: 26.11.2024, 23:41 |