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 не приводит к ошибке.

Помогите разобраться что происходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 14.7.2010, 12:36
Сообщение #2


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

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

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




Репутация:   29  


Цитата(Алексей1153 @ 14.7.2010, 8:55) *
должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён)
Где вы увидели конструктор копирования? Он явно не определён.

Цитата(Алексей1153 @ 14.7.2010, 8:55) *
строчки
A r1(std::string(v[1]));
и
A r3(s);
проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы
Вы не внимательно прочитали мое первое сообщение. r2 и r4 тоже нигде далее по коду не используются. Тем не менее они не с оптимизированны, как вы это объясните? С r3 вообще икаких проблем нет. Игнорируются r1 и r2.


Цитата(DEADHUNT)
Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной.
Цитата(DIMEDROLL)
1>\testprocload.cpp(32) : warning C4930: 'A r1(std::string [])': prototyped function not called (was a variable definition intended?)
1>\testprocload.cpp(35) : warning C4930: 'A r2(std::string)': prototyped function not called (was a variable definition intended?)

Спасибо, теперь понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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