Can I have a ~destructor(void)?

7

看了一些我以前的代码,发现由于笨拙,我定义了一个析构函数,如下:

~ResourceManager(void);

这不仅编译通过,而且按预期工作。当然,我进行了修改

~ResourceManager();

但是我重构得太快了吗?第一个版本是否符合正确的C++风格?

编辑

由于问题已关闭,并且不会有任何机会进行正确的消歧,因此我应该引用标准中回答这个问题的相关引用,在析构函数被放置在透视图中时

12.4 析构函数

  1. 使用可选的函数说明符(7.1.2)后跟˜,后跟析构函数的类名,后跟空参数列表的特殊声明符号用于在类定义中声明析构函数。在这种声明中,˜后面跟随析构函数的类名可以被括在可选的括号中;忽略这样的括号。typedef名称不得用作析构函数声明符号中∼之后的类名称。

所以标准规定必须使用空参数列表。也许是与C语言实践中的自由函数(其中f(void)是声明空参数列表的方式)向后兼容,导致在实现中将析构函数与它们一起带走,但这显然不是有效的C++


3
void参数不会产生任何影响。这是C语言的一个特点,在C中,它确实会产生影响。在C++中,你不需要它。 - juanchopanza
从风格上来说,不要使用 void。你几乎永远不会看到它被这样写。 - Paul Roub
糟糕,我应该检查一下它是否是重复的。:( - Almo
1
@juanchopanza,作为重复问题的链接并没有将析构函数(或任何其他成员函数)放在适当的角度进行讨论。 - Nikos Athanasiou
需要什么“视角”?这个副本解释了函数参数中void的含义。 - juanchopanza
3个回答

7

这是C语言中的遗留问题。在C语言中,空参数列表并不表示一个不带参数的函数,而是表示一个具有未指定数量参数的函数。在C++中,foo(void)已经被弃用了,更推荐使用foo(),因为它明确表示一个不带参数的函数。同样的道理也适用于析构函数。虽然这两行代码是等效的,但你应该优先选择使用~ResourceManager()版本。


因此在C语言中:void f(); f(1, 2, 3)是可以的,但void g(void); g(1, 2, 3)不行。 - user2249683
@DieterLücking 正确。 - 101010

2
这两行代码没有区别。()(void)是一样的。从风格的角度来看,()通常用于没有参数的函数。

2

两行代码是等价的。有些开发人员喜欢在无参数函数的参数签名中显式地使用 (void),这样可以告诉任何阅读代码的人“它不需要任何参数”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接