什么时候强制转换调用新类型的构造函数?

时间:2011-06-07 05:36:24

标签: c++ casting

确定特定static_cast是否会调用类的构造函数的规则是什么? c风格/功能风格演员怎么样?

3 个答案:

答案 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_castdynamic_castreinterpret_cast永远不会创建新的类型对象,因此永远不会调用构造函数。

由于C风格的演员表总是执行static_castconst_castreinterpret_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 );