4

我想知道,当有人给你一个 C++ 中默认构造函数的模板时,在参数中有一系列未命名的变量,它们以某种方式被赋值。这是什么意思?这合法吗?如何访问这些变量?

我收到的示例:

IntSet::IntSet(int = -1, int = -1, int = -1, int = -1); //default constructor

我将不胜感激任何澄清这种用途的答案!

4

2 回答 2

6

在声明或函数定义中不命名参数是完全合法的。在声明和定义中为给定参数使用不同的名称也是完全合法的。

请注意,如果定义中未命名的参数不可访问。为什么要这样做?许多编译器可以抱怨未使用的参数。如果函数定义没有命名那些未使用的参数,大多数编译器都不会抱怨。

关于声明中的未命名参数,这是这个问题的主题:仅仅因为这样做是合法的,并不一定意味着这是一个好习惯。函数声明中的那些未命名参数对于编译器来说可能没问题,但对于人类读者来说就不行了。没有名字=零交流。文档和头文件应包含外部用户需要了解的有关如何使用该类的所有内容。RTFM,也许还有 RTFH(阅读精美的手册/阅读精美的标题)。RTFM 和 RTFH 中的“F”字(“fine”)在 RTFC 中具有不同的含义。

标题中的那些未命名参数几乎不可避免地与糟糕的文档相结合。作为外部用户,这迫使我阅读函数的定义以了解如何使用函数。RTFC。当外部用户必须阅读实现以确定发生了什么时,这是不好的。

于 2012-10-13T23:55:32.297 回答
1

这意味着如果您在不传递参数的情况下调用它,则参数将采用您传递的值。

所以如果你打电话

IntSet* i = new Intset();

相当于打电话

Intset* i = new IntSet(-1,-1,-1,-1)

关于未命名的部分。我会假设因为它是使用模板的库的一部分。未使用无名参数,但存在,因此它与可能需要它们的另一个类的签名相匹配。在需要它们的情况下,默认情况下它只会传递-1。您可以查看此链接作为示例:

http://compgroups.net/comp.lang.c++/unnamed-formal-parameter/1004784

我在这里从上面的参考资料中复制了这个例子,以说明以一种有用的方式使用这种结构

例如

class A
{
     public:
     A(void* = 0) {}    // unused parameter
};

class B
{
    public:
    B(void* p) : pp(p) {} // used parameter
private:
    void* pp;
};

template <class T>
class C
{
public:
    static T* create(void* p = 0) { return new T(p); }
};

int main()
{
    A* a = C<A>::create();
    B* b = C<B>::create("hello");
}

C::create 不会编译,除非 A::A 有一个参数,即使它没有被使用。

于 2012-10-13T23:26:14.467 回答