Jam*_*nze 13
每次创建新对象时,都会调用构造函数.A 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 ) );
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,演员阵容是不必要的,并且在不存在的情况下将隐式地进行转换.但在所有情况下:将调用隐式转换,static_castC样式cast((A) someB)或函数样式cast(A( someB ))
B::operator A().)
Jam*_*lis 12
只要创建了该类型的新实例,就会调用类类型的构造函数.如果强制转换创建该类类型的新对象,则调用构造函数.重载决策确定在给定特定参数的情况下调用类类型的哪个构造函数.
如果a的目标类型static_cast是类类型,它将创建目标类型的新对象.
A const_cast,, dynamic_cast或reinterpret_cast永远不会创建新的类类型对象,因此永远不会调用构造函数.
由于C样式转换始终执行的某种组合static_cast,const_cast以及reinterpret_cast,它会创建一个相同的情况下一个新的对象static_cast将创建一个新的对象.
| 归档时间: |
|
| 查看次数: |
9184 次 |
| 最近记录: |