静态方法类实例化 < P> C++这样的代码行>代码> fot3= fo::构造(true);默认构造函数为私有时工作?我的假设(显然是错误的)是调用默认构造函数,然后调用赋值运算符。该假设肯定不正确,因为默认构造函数是私有的,无法调用

静态方法类实例化 < P> C++这样的代码行>代码> fot3= fo::构造(true);默认构造函数为私有时工作?我的假设(显然是错误的)是调用默认构造函数,然后调用赋值运算符。该假设肯定不正确,因为默认构造函数是私有的,无法调用,c++,static-methods,C++,Static Methods,一个具体的例子: 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() { /

一个具体的例子:

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
时,幕后到底发生了什么?

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


它从从
construct
返回的临时对象中复制
t3
,您的行不调用默认构造函数或复制赋值运算符

Foo t3 = Foo::construct(true); //It works! Why?
它从
construct
返回的临时对象复制
t3

Foo t3 = Foo::construct(true); //It works! Why?
因为这不是默认的初始化,而是赋值

1) 当 声明非引用类型T时,初始值设定项由 等号后跟表达式

所以根据这个说法,

如果T是类类型,则cv不合格版本的类型为 另一个是T或从T派生的类,T是 T进行检查,并通过过载分辨率选择最佳匹配。 然后调用构造函数来初始化对象

这是:

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

在您的案例中使用隐式声明的移动构造函数

因为这不是默认的初始化,而是赋值

1) 当 声明非引用类型T时,初始值设定项由 等号后跟表达式

所以根据这个说法,

如果T是类类型,则cv不合格版本的类型为 另一个是T或从T派生的类,T是 T进行检查,并通过过载分辨率选择最佳匹配。 然后调用构造函数来初始化对象

这是:

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


在您的案例中使用隐式声明的移动构造函数。

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

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

foot3=Foo::construct(true)制作副本(对称)。这有什么问题?@NathanOliver我实际上不确定复制构造函数是否会自动生成,是吗?@πάνταῥεῖ 根据12.8,如果类定义没有显式声明一个复制构造函数,则隐式声明一个。@NathanOliver THX,如前所述,我不确定在这种情况下是否会自动生成复制构造函数和复制赋值运算符。
Foo t3=Foo::construct(true)制作副本(对称)。这有什么问题?@NathanOliver我实际上不确定复制构造函数是否会自动生成,是吗?@πάνταῥεῖ 根据12.8,如果类定义没有显式声明一个复制构造函数,则隐式声明一个。@NathanOliver THX,如前所述,我不确定在这种情况下是否会自动生成复制构造函数和复制赋值运算符。这可能很有用:问题的实质不是此模式是否有效。正如你已经证明的那样,它确实如此。但是在我的主要方法中t3是如何构造的。它使用的是什么构造函数?这可能很有用:问题的本质不是这个模式是否有效。正如你已经证明的那样,它确实如此。但是在我的主要方法中t3是如何构造的。它使用什么构造函数?谢谢你的参考链接!用我自己的话来说,一个复制构造函数是由编译器创建的,并用于t3的实例化。移动示意图也可能涉及吗?请参阅更新的答案,是的,您的案例中使用了隐式移动ctor。谢谢参考链接!用我自己的话来说,一个复制构造函数是由编译器创建的,并用于t3的实例化。移动示意图也可能涉及吗?请参阅更新的答案,是的,您的案例中使用了隐式移动ctor。