C++隨筆 之 explicit 關(guān)鍵字(轉(zhuǎn)載)
explicit關(guān)鍵字用于取消構(gòu)造函數(shù)的隱式轉(zhuǎn)換,對有多個參數(shù)的構(gòu)造函數(shù)使用explicit是個語法錯誤。
"nonconverting", and explicit constructor syntax is required:
In C++ it is possible to declare constructors for a class, taking a single parameter, and use those constructors for doing type conversion. For example:
class ?A?{
public :
??????? A( int );
};
void ?f(A)?{}
void ?g()
{
???????? A?a1? = ? 37 ;
???????? A?a2? = ?A( 47 );
???????? A?a3( 57 );
???????? a1? = ? 67 ;
???????? f( 77 );
}
A declaration like:
?A a1 = 37;
says to call the A(int) constructor to create an A object from the integer value. Such a constructor is called a "converting constructor".
However, this type of implicit conversion can be confusing, and there is a way of disabling it, using a new keyword "explicit" in the constructor declaration:
Using the explicit keyword, a constructor is declared to beclass ?A?{
public :
??????? explicit ?A( int );
};
void ?f(A)?{}
void ?g()
{
????????? A?a1? = ? 37 ;?????? // ?illegal
????????? A?a2? = ?A( 47 );??? // ?OK
????????? A?a3( 57 );??????? // ?OK
????????? a1? = ? 67 ;???????? // ?illegal
????????? f( 77 );?????????? // ?illegal
}
"nonconverting", and explicit constructor syntax is required:
class ?A?{
public :
???????? explicit ?A( int );
????????};
void ?f(A)?{}
void ?g()
{
????????A?a1? = ?A( 37 );
????????A?a2? = ?A( 47 );
????????A?a3( 57 );
????????a1? = ?A( 67 );
????????f(A( 77 ));
}
Note that an expression such as:
A(47)
is closely related to function-style casts supported by C++. For example:
double d = 12.34;
int i = int(d);
posted on 2007-01-16 13:21 木木頭 閱讀(424) 評論(0) 編輯 收藏 引用 所屬分類: C++特性
