当默认构造函数是私有的时,这个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
后幕后真的发生了什么?
答案 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)
静态构造方法属于该类,可以访问私有构造函数 - 这通常在实现工厂模式时使用。