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

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


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


должен 4 раза вызваться - все 4 раза конструктор копирования (поскольку он явно определён)

строчки
A r1(std::string(v[1]));
и
A r3(s);
проигнорированы оптимизатором, так как эти локальные переменные нигде далее не использованы. Можно вывести их значение в поток тоже, чтобы они "остались", либо отрубить оптимизацию (а в дебаге должно само остаться, кстати)

Цитата(igor_bogomolov @ 14.7.2010, 2:34) *
Это связано с неоднозначностью, компилятор не может отличить декларацию прототипа функции от объявления переменной.

Ну ну :) С каких в C++ стало можно объявлять локальные функции ?

[offtop]
Цитата(igor_bogomolov @ 14.7.2010, 2:34) *
A r1(std::string(v[1])); может рассматриваться как функция A r1(std::string) с параметром по умолчанию v[1] и т. д.

а если бы это и было прототипом, то синтаксис неверен - какой ещё тут параметр по умолчанию ? :) std::string() - это конструктор класса std::string. А параметр по умолчанию пишется после "="
[/offtop]



Цитата(DIMEDROLL @ 14.7.2010, 10:29) *
Что значит нельзя?

ты объявил не функцию, сделал предопределение глобальной функции foo ИМХО
int foo(int a);
    
int main(int c, char ** v)
{
    int r = foo(5);
    
    return 0;
}


int foo(int a){
    return a+=2;
}


Хотя, студия, к примеру, не позволила бы сделать это внутри функции ))

Сообщение отредактировал Алексей1153 - 14.7.2010, 7:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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