静态方法类实例化
Static method class instantiation
当默认构造函数为私有时,像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
静态构造方法属于类,可以访问私有构造函数——这在实现工厂模式时经常使用。
相关文章:
- 静态数据成员模板专用化的实例化点在哪里
- 如何在没有实例的情况下获取非静态方法的类型?
- 使用动态实例化的对象填充矢量的快速方法
- 检查类是否在方法中实例化
- 如何正确实例化静态字段 tat 是另一个类对象
- 初始值设定项列表是否足够静态以允许实例化模板?
- 类外的静态变量实例化
- 从 c++ 中的实例化进程获取输出的可靠方法是什么?
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 当c++实例化方法?
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在子类上调用模板化静态方法时获取类的类型名
- 虚幻引擎:实例化静态网格体在实例化时不旋转
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 为什么可以从实例化基类对象的投射指针调用非静态派生类方法
- 在类接口内的模板化静态方法中使用std::generator_canonical
- 有没有一种更简单的方法来实例化静态库
- 如何在静态方法中实例化当前类的实例
- 静态方法类实例化