是否有可能让构造函数具有不同的名称作为类声明?

时间:2018-02-06 16:39:06

标签: c++

我在阅读源代码时遇到了一个简单的问题。 AFAIK,构造函数的名称应与声明的类相同。但是,以下代码具有不同的名称作为构造函数。任何人都可以告诉我为什么这段代码有效?

class directFieldMapper
:
    public FieldMapper
{
    const labelUList& directAddressing_;

    bool hasUnmapped_;

public:

    // Constructors

        //- Construct given addressing
        patchFieldSubset(const labelUList& directAddressing)
        :
            directAddressing_(directAddressing),
            hasUnmapped_(false)
        {
            if (directAddressing_.size() && min(directAddressing_) < 0)
            {
                hasUnmapped_ = true;
            }
        }

    //- Destructor
    virtual ~directFieldMapper()
    {}
}

好的,我发现这个类不在Makefile的源代码列表中。所以,这个类永远不会被编译。

1 个答案:

答案 0 :(得分:5)

  

是否可以让构造函数具有与声明的类不同的名称?

没有

  

AFAIK,构造函数的名称应与声明的类相同。

正确。

  

但是,以下代码具有不同的名称作为构造函数。

根据C ++标准,代码格式不正确。

  

任何人都可以告诉我为什么这段代码有效?

如果它有效,那么这是由于某种语言扩展。您可以参考编译器手册,了解它提供的语言扩展,以及如何启用/禁用它们。

由于格式错误,所有编译器都需要发出诊断消息,否则它们不符合要求。 GNU编译器的示例输出:

error: ISO C++ forbids declaration of 'patchFieldSubset' with no type [-fpermissive]

         patchFieldSubset(const labelUList& directAddressing)

                                                            ^

warning: non-static reference 'const labelUList& directFieldMapper::directAddressing_' in class without a constructor [-Wuninitialized]

     const labelUList& directAddressing_;

                       ^~~~~~~~~~~~~~~~~

error: expected ';' after class definition

 }
  ^