crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Вопрос по с++, Помогите понять суть
igor_bogomolov
  опции профиля:
сообщение 13.7.2010, 23:34
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Вопрос из теста.
Раскрывающийся текст
#include <string>

class A
{
public :
      A(const std::string & s) : m_name(s) {}
      ~A() { }
private :
      std::string m_name;
};

int main(int c, char ** v)
{
      A r1(std::string(v[1]));

      const char * e = "Hello";
      A r2(std::string(e));
      std::string s(e);

      A r3(s);
      A r4(std::string("World"));
      return 0;../test/main.cpp:25: ошибка: запрос элемента ‘m_name’ в ‘r2’, имеющего не классовый тип ‘A(std::string)’ [quote][/quote]
}

Вопрос в тесте такой - сколько раз вызовется конструктор класса 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, 1:45
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной.


A r1(std::string(v[1])); может рассматриваться как функция A r1(std::string) с параметром по умолчанию v[1] и т. д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 10:13