构造函数参数中没有名称的变量?

时间:2012-10-13 23:14:27

标签: c++ variables constructor arguments

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

我收到的例子:

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

我很感激任何澄清这种用法的答案!

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分: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有一个参数,即使它是 没用过。