【问题标题】:Variables with no name in constructor's parameter?构造函数参数中没有名称的变量?
【发布时间】:2012-10-04 09:03:42
【问题描述】:

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

我收到的示例:

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

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

【问题讨论】:

  • 这是针对 C++ 的,我很抱歉没有澄清这一点!

标签: c++ variables constructor arguments


【解决方案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 有一个参数,即使它是 没用过。

【讨论】:

  • 参数可以在声明中不命名,如果在定义中命名,仍然可以在定义中使用。标准中没有任何内容表明参数名称(如果有)必须在声明和定义之间匹配。必须匹配的只是签名和返回类型。
  • 确实如此。我从来没有说过名字必须匹配,对不起,如果我似乎暗示不是这样。我的意思是匹配另一个模板类的参数类型和数量,如参考中的示例所示
  • 我知道这是旧的,但为什么如果我从 A(void*=0) 中删除空格,编译器会抛出错误?我知道空格无关紧要。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多