静态方法类实例化

时间:2016-08-26 16:35:10

标签: c++ static-methods

当默认构造函数是私有的时,这个Foo t3 = Foo::construct(true);的c ++行如何工作?我的假设(显然是不正确的)是调用默认构造函数,跟随我的赋值运算符。该假设必须是不正确的,因为默认构造函数是私有的,无法调用。

一个具体的例子:

class Foo {
private:
   Foo() {}
   bool bar;
public:
   Foo(bool t): bar(t) {}
   static Foo construct(bool t) {
      Foo temp; //calling private constructor;
      temp.bar = t;
      return temp;
   }
}

用于实例化此类的测试方法如下:

int main() {
   //Foo t1; //Not allowed, compile error, Foo() is private
   Foo t2(true); //Constructor, valid use
   Foo t3 = Foo::construct(true); //It works! Why?
   return 0;
}

实例化t3后幕后真的发生了什么?

3 个答案:

答案 0 :(得分:3)

Foo t3 = Foo::construct(true); //It works! Why?

因为这不是默认初始化,后面是作业copy initialization

  

1)当一个命名变量(自动,静态或线程本地)时   声明非引用类型T,初始化程序由a组成   等号然后是表达式。

所以根据这句话:

  

如果T是类类型和cv-nonqualified版本的类型   另一个是T或从T派生的类,非显式构造函数   检查T并通过重载分辨率选择最佳匹配。   然后调用构造函数来初始化对象。

和此:

  

如果other是rvalue表达式,则将选择move构造函数   重载决策并在复制初始化期间调用。没有   移动初始化等术语。

在您的情况下使用隐式声明的移动构造函数。

答案 1 :(得分:2)

您的行不会调用默认构造函数或复制赋值运算符。

它从t3返回的临时对象中复制构造construct

答案 2 :(得分:0)

静态构造方法属于该类,可以访问私有构造函数 - 这通常在实现工厂模式时使用。