确定特定static_cast是否会调用类的构造函数的规则是什么? c风格/功能风格演员怎么样?
答案 0 :(得分:13)
每次创建新对象时,都会调用构造函数。 static_cast
总是会产生一个新的临时对象(但请参阅James McNellis的评论)
立即,或通过调用用户定义的转换。 (但在
为了让一个具有所需类型的对象返回,用户定义了
转换运算符必须调用构造函数。)
当目标是类类型时,C样式转换和功能样式
根据定义,具有单个参数的强制转换与a相同
static_cast
。如果功能样式转换为零或多于一个
参数,然后它会立即调用构造函数;用户自定义
在这种情况下不考虑转换运算符。 (而且可以
质疑选择将其称为“类型转换”。)
对于记录,可能是用户定义的转换运算符的情况 称为:
class A
{
int m_value;
public
A( int initialValue ) : m_value( initialValue ) {}
};
class B
{
int m_value;
public:
B( int initialValue ) : m_value( initialValue ) {}
operator A() const { return A( m_value ); }
};
void f( A const& arg );
B someB;
f( static_cast<A>( arg ) );
在这种特殊情况下,演员是不必要的,并且转换
将在缺席的情况下隐含地进行。但在所有情况下:隐含
转换,static_cast
,C样式转换((A) someB
)或功能
样式演员(A( someB )
),
B::operator A()
将被调用。)
答案 1 :(得分:12)
只要创建了该类型的新实例,就会调用类类型的构造函数。如果强制转换创建该类类型的新对象,则调用构造函数。重载决策确定在给定特定参数的情况下调用类类型的哪个构造函数。
如果static_cast
的目标类型是类类型,它将创建目标类型的新对象。
const_cast
,dynamic_cast
或reinterpret_cast
永远不会创建新的类型对象,因此永远不会调用构造函数。
由于C风格的演员表总是执行static_cast
,const_cast
和reinterpret_cast
的某种组合,因此它会在与static_cast
相同的情况下创建新对象会创建一个新对象。
答案 2 :(得分:4)
如果有合适的转换构造函数,static_cast
将调用转换构造函数:
class Class {
public:
Class( int ); //<< conversion constructor
};
int what = 0;
Class object = static_cast<Class>( what );
同样适用于C风格的演员阵容和“功能性”演员阵容。
int what = 0;
Class object = (Class)what;
int what = 0;
Class object = Class( what );