-3

C++ 中的构造函数可以是私有的吗?如果是,那我们怎么称呼它?

class Puma
{
    int a = 10;
    Puma()
    {
        cout << a;
    }
};

int main()
{
    Puma pum;
    return o;
}

这个程序可以运行吗?如果不是,那么我们如何调用Puma()构造函数,因为它是私有的?

4

5 回答 5

20

是的,构造函数可以是私有的。您可以使用成员函数(静态或非)或友元函数来调用它。

class Puma
{
public:
    static Puma create(int a) { return Puma(a); }
private:
    int age;
    Puma(int a) :age(a) {}    

    friend Puma createPuma(int a);
};

Puma createPuma(int a) { return Puma(a); }

有关可能的用例,请参阅工厂模式命名构造函数惯用语

于 2013-08-08T17:46:39.027 回答
8

是的。构造函数可能是私有的。

在这种情况下,您可以创建类

  • 使用另一个(公共)构造函数
  • 从同一个类调用构造函数
  • 从朋友类/函数调用构造函数
于 2013-08-08T17:47:34.527 回答
3

在您的代码中,程序无法运行,因为您定义了一个构造函数并且它是私有的。因此,在您当前的代码中,无法创建类的对象,从而使类在某种意义上无用。

一种方法是您可以提供公共静态函数,这些静态函数调用私有构造函数来创建类的对象。

一件小事:

return o;

应该

return 0;
于 2013-08-08T17:47:20.217 回答
2

是的,构造函数可以是私有的。它在由静态成员函数(或朋友)调用时很有用,例如

 class Even {
  /// in practice, some more C++ code is probably needed
  private: 
    int x;
    Even(int a) : x(a) {};
  public:
     int get () const { return 2*x; }; 
     static Even* make(int y) { return new Even(y); };
  };

这个例子不是很现实,但你明白了。在使用代码中,执行

   Even* e = Even::make(3);

然而,请注意 C++的五法则,并阅读一本好的C++ 编程书籍以及 C++ 编译器(例如GCCClang)和调试器(例如GDB)的文档。您甚至可能想要使用Clang 静态分析器

例如,下载,然后查看QtFLTKRefPerSysfishGCCClang的源代码。

于 2013-08-08T17:48:54.073 回答
1

单例可以有一个私有构造函数,该构造函数将从类的静态方法中调用。

于 2013-08-08T17:47:21.343 回答