Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы для интервью 
:(
    Опции темы
mes
Дата 17.11.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Vyacheslav @  17.11.2008,  19:29 Найти цитируемый пост)
Будет различаться результаты работы двух фрагментов кода и если будут, то почему?

будет из за замены  префиксного на постфиксный (не помню как слово звучит) оператора

Цитата(Vyacheslav @  17.11.2008,  19:29 Найти цитируемый пост)
при вызове виртуальных функций в конструкторе и деструкторе. 

вызывается не виртуальная реализация . т.е реализация определенная в классе , в каком она вызвана в конструкторе.

Цитата(Vyacheslav @  17.11.2008,  19:46 Найти цитируемый пост)
  без переопределения   "открыть

using в помощь



--------------------
PM MAIL WWW   Вверх
warmonger_
Дата 18.11.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Цитата(Vyacheslav @  17.11.2008,  18:46 Найти цитируемый пост)
Как  в производном класса  без переопределения   "открыть" ( сделать public )   метод, защищенный(  protected )  в базовом классе классе

Код

struct  A 
{
  protected:
      void func() { std::cout<<"A::funс()"<<std::endl; }     
};
struct B : public A
{
     public:
         void func() { A::func(); }
};

int main(int argc, char **argv)
{
    B b;
    b.func();

    return 0;
}


Добавлено через 2 минуты и 55 секунд
Цитата(Vyacheslav @  17.11.2008,  18:29 Найти цитируемый пост)
Будет различаться результаты работы двух фрагментов кода и если будут, то почему?

будут в том смысле, что второй работать не будет ибо не lvalue i++

Это сообщение отредактировал(а) warmonger_ - 18.11.2008, 00:54
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
vinter
Дата 18.11.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(warmonger_ @  18.11.2008,  01:54 Найти цитируемый пост)
struct B : public A{     public:         void func() { A::func(); }};

я тоже только до такого допер, но 
Цитата(warmonger_ @  18.11.2008,  01:54 Найти цитируемый пост)
без переопределения

и еще, что получается с эксепшеном? Конструктор B бросает исключение, из-за того, что A не был корректно создан, или как?


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 18.11.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Vyacheslav @  17.11.2008,  20:19 Найти цитируемый пост)
Результат работы программы

имхо, вызов terminate




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Vyacheslav
Дата 18.11.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Подводим итоги:
1.Этот фрагмент не откомпилится. Потребует, чтобы было lvalue
Код

int i = 5;
  i++ +=1;  // error
  cout <<  i;


2. Формально говоря, виртуальные функции при вызове в конструкторе и деструкторе ведут себя аналогично невиртуальным.

3. 
  public:
      using A::func;

4. программа выведет на консоль сообщение  "exception". Несмотря, что function try-block в конструкторе отловит исключение, но перегенерит  его при условии,  если программист сам не удосужится сгенерить свое новое исключение.
В выше приведенном примере выражение 
Код

B()try:A(){}catch(...){ } 

эквивалентно 
Код

B()try:A(){}catch(...){ throw; } 


В  нижеприведенном примере  идет подмена одного типа исключение на другой. 
В результата  программа выдаст сообщение "constuctor error" . Первоначально сгенеренное в теле конструктора исключение погасится. Вернее -  не "погасится", а до кода его регенерации дело просто не дойдет. 
Код

struct  A
{
    int m_; 
    A(): m_(5)  { throw 1; }
};
struct B : public A
{
    B()try:A(){}catch(...){ throw "constuctor error";  } 
};
int main()
{
    try{
    B b;
    std::cout << b.m_ << std::endl;
    } 
    catch( char* c)
    {
        std::cout << c << std::endl;            
    }
    catch(...)
    {
        std::cout << "exception" << std::endl;
    }
 return 0;
}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mes
Дата 18.11.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Vyacheslav @  18.11.2008,  12:03 Найти цитируемый пост)
В выше приведенном примере выражение 

B()try:A(){}catch(...){ } 

эквивалентно 

B()try:A(){}catch(...){ throw; } 

я с исключениями пока не знаком, но интересно, на каком основании эти две строчки кода эквивалентны ?




--------------------
PM MAIL WWW   Вверх
vinter
Дата 18.11.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  18.11.2008,  13:25 Найти цитируемый пост)
я с исключениями пока не знаком, но интересно, на каком основании эти две строчки кода эквивалентны ?

я так понимаю на основании того, что объект все таки не был сконструирован.


--------------------
Мой блог
PM MAIL WWW   Вверх
Vyacheslav
Дата 18.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(mes @  18.11.2008,  12:25 Найти цитируемый пост)
я с исключениями пока не знаком, но интересно, на каком основании эти две строчки кода эквивалентны ?

Эквивалентны по поведению  smile  
На основании того, что в соответствии со стандартом, при достижении конца  блока обработчика ( catch (...) {} ) в  funtion-try-block конструктора и деструктора перехваченное исключение будет   сгенерено( rethrow)  заново, то есть фактически будет вызвано throw; 
(15.3 пункт 16)


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 18.11.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Кстати по исключениям
Результат работы  программы?
Код

void func() throw(int) { throw "func error"; }

int main()
{
    try{
        func();
    }
     catch( char* c )
    {
          std::cout << c << std::endl;
    }
     catch(int)
    {
        std::cout << "exception" << std::endl;
    }
 return 0;
}



Добавлено @ 13:30

Чему эквивалентно объявление функции?
Код

void func();

Этому 
Код

void func() throw();

или этому
Код

void func() throw(...);



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
vinter
Дата 18.11.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Vyacheslav @  18.11.2008,  14:26 Найти цитируемый пост)
Результат работы  программы?

теоретически termination()(вроде), практически func error, по крайней мере для студии, плевать студия хотела на спецификацию ))

Цитата(Vyacheslav @  18.11.2008,  14:26 Найти цитируемый пост)
Чему эквивалентно объявление функции?


Цитата(Vyacheslav @  18.11.2008,  14:26 Найти цитируемый пост)
void func() throw(...);




--------------------
Мой блог
PM MAIL WWW   Вверх
Vyacheslav
Дата 18.11.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(vinter @  18.11.2008,  14:01 Найти цитируемый пост)
теоретически termination()(вроде), практически func error, по крайней мере для студии, плевать студия хотела на спецификацию ))

По этому я обычно стараюсь при интервью держаться в рамках стандарта  smile



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
warmonger_
Дата 18.11.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Цитата(vinter @  18.11.2008,  13:01 Найти цитируемый пост)
теоретически termination()(вроде), практически func error, по крайней мере для студии, плевать студия хотела на спецификацию ))

а почему студия выводит func error? это как-то объясняется?
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Vyacheslav
Дата 18.11.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



А вот захаянный  Builder 6 в этом случае выдает результат в соответствии со стандартом smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
vinter
Дата 18.11.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(warmonger_ @  18.11.2008,  19:13 Найти цитируемый пост)
а почему студия выводит func error? это как-то объясняется?

студия игнормрует спецификаторы генерируемых исключений в сигнатуре функций, можно использовать как комментарии smile


--------------------
Мой блог
PM MAIL WWW   Вверх
warmonger_
Дата 18.11.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Цитата(vinter @  18.11.2008,  17:33 Найти цитируемый пост)
студия игнормрует спецификаторы генерируемых исключений в сигнатуре функций, можно использовать как комментарии smile 

точно... я раньше и не знал)
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.