构造函数可以在C ++中保密吗?

时间:2013-08-08 17:44:47

标签: c++

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

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

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

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

5 个答案:

答案 0 :(得分:18)

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

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); }

有关可能的用例,请参阅Factory PatternNamed Constructor Idiom

答案 1 :(得分:7)

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

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

  • 使用其他(公共)构造函数
  • 从同一个类调用构造函数
  • 从朋友类/函数
  • 调用构造函数

答案 2 :(得分:3)

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

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

一件小事:

return o;

应该是

return 0;

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

 class Even {
  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);
相关问题