静态方法类实例化

Static method class instantiation

本文关键字:实例化 静态方法      更新时间:2023-10-16

当默认构造函数为私有时,像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实例化时,在幕后真正发生了什么?

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

因为这不是默认初始化后赋值,而是复制初始化

的命名变量(自动的、静态的或线程局部的)

1)非引用类型T的初始化式由一个等号后面跟一个表达式

根据下面的语句:

如果T是类类型,并且是类型的cv-不限定版本的非显式构造函数T或从T派生的类对T进行检查,并通过过载解析选择最佳匹配。然后调用构造函数初始化对象。

:

如果other是右值表达式,move构造函数将由重载解析,在复制初始化期间调用。没有如移动初始化。

隐式声明的move构造函数在你的例子中使用。

您的行没有调用默认构造函数或复制赋值操作符。

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

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