在类中创建私有构造函数有什么用?

gir*_*iri 126 oop

为什么我们应该在类中使构造函数私有?因为我们总是需要构造函数是公开的.

nan*_*nda 124

您可能需要私有构造函数的一些原因:

  1. 只能从类本身内部的静态工厂方法访问构造函数.Singleton也可以属于这一类.
  2. 实用程序类,仅包含静态方法.

  • @Patesh:那是你的决定.其他人和我宁愿防止实用程序类的实例化而不是省略一行私有构造函数. (16认同)
  • 我甚至不打算为实用程序类创建私有构造函数. (9认同)
  • @dfa:为了防止继承,你必须在类级别上放置`final`.由于这个原因,放置私有构造函数几乎是无用的. (9认同)
  • @Will:如果您使用反射,则不会.声明构造函数private是为了防止实例化(禁止反射),但是防止子类化是副作用,而不是意图.适当的工具是声明类`final`.这就是Sun为String类所做的,以及不应该扩展的API的合理块. (3认同)

Ker*_*ido 93

通过提供私有构造函数,可以防止在除此类之外的任何位置创建类实例.有几种用例来提供这样的构造函数.

答:您的类实例是在static方法中创建的.static然后将该方法声明为public.

class MyClass()
{
private:
  MyClass() { }

public:
  static MyClass * CreateInstance() { return new MyClass(); }
};
Run Code Online (Sandbox Code Playgroud)

B.你的班级是单身人士.这意味着,程序中只存在一个类的实例.

class MyClass()
{
private:
  MyClass() { }

public:
  MyClass & Instance()
  {
    static MyClass * aGlobalInst = new MyClass();
    return *aGlobalInst;
  }
};
Run Code Online (Sandbox Code Playgroud)

C.(仅适用于即将推出的C++ 0x标准)您有几个构造函数.其中一些是宣布的public,其他的private.为了减少代码大小,公共构造函数"调用"私有构造函数,这些构造函数反过来完成所有工作.public因此,您的构造函数称为委托构造函数:

class MyClass
{
public:
  MyClass() : MyClass(2010, 1, 1) { }

private:
  MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};
Run Code Online (Sandbox Code Playgroud)

D.您希望限制对象复制(例如,由于使用共享资源):

class MyClass
{
  SharedResource * myResource;

private:
  MyClass(const MyClass & theOriginal) { }
};
Run Code Online (Sandbox Code Playgroud)

E.你的班级是实用班级.这意味着,它只包含static成员.在这种情况下,不能在程序中创建任何对象实例.

  • 在大多数情况下,您可能希望阻止对象复制.因此,您不会为私有拷贝构造函数提供实现. (3认同)

Emi*_*ier 12

留下"后门",允许其他朋友类/功能以禁止用户的方式构造对象.想到的一个例子是构造迭代器(C++)的容器:

Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.
Run Code Online (Sandbox Code Playgroud)

  • 没有人会读到这个,但是这里有:我已经在这一次上被投了几次.没有沮丧或任何事情,但(为了学习)我想知道为什么这是坏事?如何使用访问容器数据所需的数据构建迭代器? (3认同)
  • @EmileCormier,我认为你得到了不公平的投票,因为人们一次又一次地学习C++:"避免朋友声明".这个建议似乎针对的是没有经验的C++程序员,否则他们可能会使用"朋友"而不保证 - 并且有很多情况下这是一个坏主意.可悲的是,这个消息得到了很好的接受,许多开发人员从来没有充分理解这种语言,因此偶尔使用"朋友"不仅可以接受,而且*更好*.你的例子就是这样的例子.*有意识*强耦合不是犯罪,这是一个设计决定. (2认同)

Ter*_*fey 9

每个人都被困在单身人士身上,哇.

其他事情:

  • 阻止人们在堆栈上创建你的类; 创建私有构造函数,并通过工厂方法只返回指针.
  • 防止创建类的copys(私有拷贝构造函数)


Wil*_*ill 7

这对包含公共代码的构造函数非常有用; 私有构造函数可以被其他构造函数调用,使用'this(...);' 符号.通过在私有(或受保护的)构造函数中创建公共初始化代码,您还明确地明确表示仅在构造期间调用它,如果它只是一个方法则不是这样:

public class Point {
   public Point() {
     this(0,0); // call common constructor
   }
   private Point(int x,int y) {
     m_x = x; m_y = y;
   }
};
Run Code Online (Sandbox Code Playgroud)