|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 11, 2004 01:21:26 · Поправил: Black_mirrorint 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 |