2016-06-16 2 views
-1

У меня есть этот класс:Объем некоторых скобок

class CNullDecorator: public CBaseDecorator, public CPooledObject<CNullDecorator> 
{ 
public: 
    CNullDecorator(){} 
    virtual~CNullDecorator(){} 

protected: 
    virtual void __Excute(const CDecoratorData &d){} 
    virtual CBaseDecorator *__Clone(CParticleInstance *, CParticleInstance *) 
    { 
     return new CNullDecorator; 
    } 
}; 

Как вы можете видеть CNullDecorator(){} и virtual~CNullDecorator(){} есть некоторые скобки открыты, но ничего внутри скобок. Почему мой вопрос? В какой области есть эти скобки?

ответ

1

Это встроенные функции, которые ничего не делают. Вы могли бы получить

CNullDecorator() { return ; } 

и получить такой же эффект.

0

{ } определяет тело функции. В вашем случае это обязательно означает, что CNullDecorator() (конструктор), ~CNullDecorator() (деструктор) и __Excute() (защищенный метод) не имеют тела, т. Е. Ничего не делают.

EDIT: (отвечая на вопрос, заданный в комментариях)

Если CNullDecorator не используется. Или конструктор или деструктор никогда не используется и могу ли я его удалить?

Конструктор и деструктор (наряду с несколькими другими материалами) - это то, что по умолчанию предоставляет компилятор C++, если программист их опускает. В вашем случае конструктор можно удалить, так как он ничего не делает, но деструктор, который вы создали, - virtual (хотя и пустой), поэтому вам придется держать его таким, каким оно должно быть.

Подробнее о виртуальном деструкторе here.

+0

Если CNullDecorator не используется. Или конструктор или деструктор никогда не используется и только что определен, я могу его удалить? – marc

+0

Рекомендуется, чтобы вы отредактировали свой вопрос, включив указанный выше запрос, а не задали его в комментариях. – CinCout

0

Прежде всего, это не скобки, а скобки.

Все области имеют брекеты. Но некоторые области являются более особенными, чем другие. Функция представляет собой целую область. В этом случае:

CNullDecorator(){} 

Это объявляет пустой конструктор, конструктор без кода. Как правило, вы будете иметь конструктор делать что-то:

CNullDecorator() 
{ 
    // Some code here. Initialize this to that. Call some other 
    // function 
} 

Притворитесь, что есть код внутри фигурных скобок. Теперь у вас есть типичный конструктор. Но ничто фактически не требует, чтобы у вас был какой-либо код в конструкторе. Итак, если вы его не заметите, у вас будет пустой набор брекетов.

Это не делает ничего полезного. Вы можете полностью исключить конструктор, и компилятор с радостью предоставит его вам. Это вопрос стиля.

С другой стороны, есть причина, почему деструктор так оно и есть:

virtual ~CNullDecorator(){} 

Это также заявляет, деструктор, который пуст, и не содержит никакого кода.

Но в этом случае есть причина для этого. Как и в случае с конструктором, если вы полностью исключаете деструктор, компилятор будет предоставлять деструктор по умолчанию.

Но это объявление делает что-то еще немного: объявляет виртуальный деструктор.

В этом случае необходимо, чтобы весь этот класс был виртуальным деструктором. Виртуальному деструктору не нужно было ничего делать явным, поэтому его содержимое было пустым. Но для класса требовался виртуальный деструктор, поэтому его нужно было объявить.

+0

Скобки - это своего рода скобки, не так ли? – CinCout

Смежные вопросы