Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一些括号的范围_C++ - Fatal编程技术网

C++ 一些括号的范围

C++ 一些括号的范围,c++,C++,我有这门课: class CNullDecorator: public CBaseDecorator, public CPooledObject<CNullDecorator> { public: CNullDecorator(){} virtual~CNullDecorator(){} protected: virtual void __Excute(const CDecoratorData &d){} virtual CBaseDecor

我有这门课:

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:公共CBaseDecorator,公共CpooleObject
{
公众:
CNullDecorator(){}
虚拟~cnulldecotor(){}
受保护的:
虚空执行(const CDecoratorData&d){
虚拟CBaseDecorator*\uuu克隆(CParticleInstance*,CParticleInstance*)
{
返回新的CNullDecorator;
}
};
正如您所看到的,
cnulldecotor(){}
virtual~cnulldecotor(){}
打开了一些括号,但括号内没有任何内容。我的问题是为什么?
哪个作用域有括号?

它们是不做任何事情的内联函数。你本来可以的

 CNullDecorator () { return ; }

并获得相同的效果。

{}
定义函数体。在您的情况下,这必然意味着
cnulldecontor()
(构造函数)、
~cnulldecontor()
(析构函数)和
\u Excute()
(受保护的方法)没有主体,即它们什么都不做

编辑:(回答评论中提出的问题)


如果没有使用CNULLDecotor。或者构造函数或析构函数永远不会 已使用且刚刚定义我可以删除它吗

构造函数和析构函数(以及其他一些东西)是C++编译器默认情况下提供的,以防程序员忽略它们。在您的情况下,构造函数可以被删除,因为它什么也不做,但是您创建的析构函数是虚拟的(虽然是空的),因此您必须保持它的行为方式


更多关于虚拟析构函数的信息。

首先,它不是括号,而是大括号

所有作用域都有大括号。但有些范围比其他范围更特殊。函数是一个完整的作用域。在这种情况下:

CNullDecorator(){}
这声明了一个空构造函数,一个没有代码的构造函数。通常,您将有一个构造函数执行以下操作:

CNullDecorator()
{
     // Some code here. Initialize this to that. Call some other
     // function
}
假装括号里有代码。现在您有了一个典型的构造函数。但实际上,没有什么东西需要在构造函数中包含任何代码。所以,如果你不使用它,你会有一组空的大括号

这真的没有什么用处。您可以完全省略构造函数,编译器将很乐意为您提供它。这是风格的问题

另一方面,析构函数之所以如此是有原因的:

virtual ~CNullDecorator(){}
这还声明了一个空的析构函数,并且不包含任何代码

但在这种情况下,这是有原因的。与构造函数类似,如果完全省略析构函数,编译器将提供默认析构函数

但是这个声明做了更多的事情:它声明了一个虚拟析构函数


在这种情况下,这个类所需要的只是一个虚拟析构函数。虚拟析构函数不需要执行任何显式操作,因此其内容为空。但是,该类需要一个虚拟析构函数,因此必须声明它。

大括号是一种括号,不是吗?如果不使用cnulldecotor。或者从来没有使用过构造函数或析构函数,只是定义了它。我可以删除它吗?建议您编辑您的问题以包含上述查询,而不是在注释中询问它。