Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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+中的非平凡析构函数+;?_C++_Destructor - Fatal编程技术网

C++ 什么是C+中的非平凡析构函数+;?

C++ 什么是C+中的非平凡析构函数+;?,c++,destructor,C++,Destructor,我在读一篇文章,其中提到析构函数是琐碎的和非琐碎的 如果类具有显式的 定义的析构函数,或者如果它有一个成员对象或基类 有一个非平凡的析构函数 例如,我有一门课 class C { public: ~C(); // not explicitly declared. }; 如果C::~C()是隐式定义的,它会成为一个繁琐的数据吗?那么你的意思是,C的整个声明如下: class C { }; ? 然后,是:由于C没有成员对象和基类,因此它没有具有非平凡析构函数的成员对象,也没有具

我在读一篇文章,其中提到析构函数是琐碎的和非琐碎的

如果类具有显式的 定义的析构函数,或者如果它有一个成员对象或基类 有一个非平凡的析构函数

例如,我有一门课

class C {
    public:
     ~C(); // not explicitly declared.
};

如果
C::~C()
是隐式定义的,它会成为一个繁琐的数据吗?

那么你的意思是,
C
的整个声明如下:

class C { };
?


然后,是:由于
C
没有成员对象和基类,因此它没有具有非平凡析构函数的成员对象,也没有具有非平凡析构函数的基类,因此,它的隐式定义的析构函数是一个微不足道的析构函数。

我认为,一般来说,它指的是一个实际执行某些操作的析构函数,例如:

  • 释放内存
  • 关闭与数据库的连接
  • 或者处理任何需要释放的资源

在这种情况下,析构函数不执行任何操作。根据描述,从技术上讲,它可能是“不平凡的”,因为它定义了一个构造函数,但它并不重要,因为它无论如何都不做任何事情。

你把你的话弄混了。您的示例确实声明了显式析构函数。你只是忘了定义它,所以你会得到一个链接器错误


规则非常简单:您的类是否有显式析构函数?如果是的话,你就不平凡了。如果否,则检查每个非静态成员对象;如果它们中有任何一个是非平凡的,那么你就是非平凡的。

更像是一个可以做一些事情的析构函数。如果析构函数是在与使用该类的代码不同的翻译单元中定义的(
C.cpp
vs.
main.cpp
或诸如此类),那么当编译器编译
main.cpp
时,它必须假设每当自动存储的
C
实例超出范围时,它需要调用
C
的析构函数,因为它无法知道析构函数实际上什么都不做。“在这种情况下,析构函数什么都不做。”你怎么知道?没有给出dtor的定义。平凡析构函数是标准使用的一个技术术语,根据该术语的定义,OP的析构函数是非平凡的。作为旁注:
C::~C(){}
仍然是一个非平凡析构函数。即使你什么都不做,你也什么都没做。平凡的析构函数/构造函数总是由编译器为您创建的。@CortAmmon:更准确地说,它需要隐式定义。用户声明是可以的,如果它也是默认的(必须在第一次声明时发生)。我知道=删除,但不知道=default@KerrekSB
检查每个非静态成员对象;如果其中任何一个都是非平凡的
我不明白这一点,那么非平凡的非静态成员是什么意思?@KerrekSB 1。非静态非平凡对象是什么意思?2.你能告诉我析构函数什么时候是普通型的吗?