跟着侯捷老师学C++☛构造函数private?

121 阅读1分钟

通常来说,构造函数不能private,不然外界创建对象的时候无法调用了。那什么时候会用到这个方式呢? 答案是单例模式

代码

class A {
public:
  static A& getInstance( return a; );
  setup() { ... }
private:
  A();
  A(const A& rhs);
  static A a;
...
};

分析

  1. class里有static A,所以一开始就创建好了一个静态变量A a
  2. 构造函数放到private,所以外界不能直接创建A
  3. 外界调用 getInstance 的时候,返回之前创建好的a

问题

a一开始就存在了。即使外界没有调用 getInstance ,它也已经存在了。因为在class定义里就写了static A a

优化代码

class A
{
public:
  static A& getInstance();
  setup() {...}

private:
  A();
  A(const A& rhs);
  ...
}

A& A::getInstance()
{
  static A a;
  return a;
}

代码调用 A::getInstance().setup()

分析

  1. 多个构造函数,放到private,所以外界不能直接创建A
  2. 外界调用 getInstance 的时候,利用static A a创建了一个A并返回
  3. 创建A是内部函数getInstance创建的,所以可以调用private的构造函数

说明

static的变量,只有当执行这一行时才执行并生成。 所以在优化代码里,只有调用了getInstance,才会创建一个static A