我见过两种在C++中定义转换运算符重载的样式:
operator int* (void) const
operator int*() const
问题1. 我认为这两种方式(是否添加 void
)具有相同的功能,是吗?
问题2. 你有任何偏好哪种更好吗?
我见过两种在C++中定义转换运算符重载的样式:
operator int* (void) const
operator int*() const
问题1. 我认为这两种方式(是否添加 void
)具有相同的功能,是吗?
问题2. 你有任何偏好哪种更好吗?
这不仅适用于转换运算符,而是适用于C++中所有没有参数的函数。出于一致性考虑,个人更喜欢省略void
。
这种做法起源于C语言。在C语言没有原型时,空括号对在函数声明中被用来表示未指定参数,并没有提供有关函数所期望的参数的信息。
当原型被添加时,空括号被保留在函数声明中以表示“未指定参数”,以实现灵活性和向后兼容性。为了提供一个显式的原型表示“不带参数”,加入了语法(void)
。
在C++中,所有函数声明都必须有原型,因此()
和(void)
具有相同的含义。
引用自ISO C++ FAQ,我应该使用f(void)
还是f()
?
C程序员在声明不带参数的函数时通常使用
f(void)
,然而在C ++中,这被认为是一种不良风格。事实上,f(void)
样式被C++的创建者Bjarne Stroustrup、C的共同创造者Dennis Ritchie以及Unix诞生的研究部门负责人Doug McIlroy称为“丑陋的东西”。如果您正在编写C++代码,则应使用
f()
。在C++中,f(void)
样式是合法的,但只是为了更容易地编译C代码。
权威性的呼声高 :)
void (*func)() = /* 接受int类型参数的函数 */; func(11); func = /* 接受char *类型参数的函数 */; func("hello");
但这种方法的价值是可疑的。 - Chris Lutz我相信在“旧版”C语言中(不知道是哪个版本),foo()
表示“任意参数”,而foo(void)
表示没有参数。我相信在c99中,foo()
的“任意参数”版本已经被弃用。
快速搜索发现this wikipedia文章提到了类似的事实。
C++将接受foo(void)
,但它的意思与foo()
相同,即表示“没有参数”。
因此,在C++中,首选的方法是使用foo()
。
省略void。在旧式C中,所有函数都被假定为int name(...)
。指定void意味着它不是可变长度参数。该默认值已被删除,所有函数都必须指定(谢天谢地。当任何东西都可以是任何东西时,这是野蛮的西部)。在C++中,您永远不需要编写(void)。省略它。就像C++库一样。