· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HEAP —› Небольшая задачка для знающих C++

Посл.отвђт Сообщенiе


Дата: Апр 11, 2004 01:21:26 · Поправил: Black_mirror

int x=0;
class A
{
public:
  A(){incX();};
  virtual ~A(){decX();};
  virtual incX(){x+=2;};
  virtual decX(){x-=2;};
};
class B:public A
{
public:
  B(){incX();};
  ~B(){decX();};
  virtual incX(){x+=3;};
  virtual decX(){x-=3;};
};
void f()
{
  static B b;
}
void main()
{
  f();
//чему здесь будет равно x?
}
К тем, кто уже успел проверить свое предположение, просьба дать время подумать остальным. А на этой странице можно написать правильным оно было или нет. Или предложить какую-то другую задачку 8)


Дата: Апр 11, 2004 01:33:13

Товарищь, теория и практика часто расходятся. Например cl в VC++ 2003 на столько жестко все оптимизирует, то просто край. Пустые функции не вызываются, пустые циклы вообще не компилируются. Поэтому тут может быть все что угодно. Все зависит от компилятора.


Дата: Апр 11, 2004 01:46:41

_DEN_
Думаю что в этом случае от компилятора результат не зависит.


Дата: Апр 11, 2004 08:19:00

Я думаю, зависит, если компилятор оптимизирующий(типа VC++ 2003 или Intel C++) то возможно будет 0, т.к. не использующийся объект не будет создаваться, а так единица должна быть.


Дата: Апр 11, 2004 11:30:31

На самом деле первоначальный вопрос задан несколько некорректно:
"чему здесь будет равно x?"...
Ответом тогда будет: "здесь нет никакого x" :)))
И оптимизатор действительно имеет право не вызывать бесполезные функции.
А вот если попытаться, например напечатать значение х, то в этом
случае код, генерирующий его значение, должен быть создан.
И если в вашем любимом оптимизирующем компиляторе это не так, то
его необходимо выкинуть на помойку, пока не стало слишком поздно... ;)


Дата: Апр 11, 2004 14:29:28

Black_mirror
"Виртуальный" конструктор захотелось ?

а как насчет такой f() ?
void f()
{
static B b;
b.A::A();
b.incX();
}


Дата: Апр 11, 2004 19:53:43

Не знаю, это в тему или нет, но перекрытые виртуальные методы не вызываются в конструкторах, например:
class Base
  {
  private:
    int x;

  public:
    Base () {
      x = 0;
      Init (); // Here overriden A::Init() will never be called!
      }

    virtual void Init () {
      x += 3;
      }
  };

class A : public Base
  {
  public:
    A () : Base () {
      }

    virtual void Init () {
      x += 7;
      }
  };


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.052