範囲

2016-06-16 14 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