2012-05-03 12 views
13

あなたは後者を見たことがありC++では、static_cast <double>(a)とdouble(a)の違いは何ですか?

int a; 
// a gets some value 
double pi = static_cast<double>(a)/3; 

int a; 
// a gets some value 
double pi = double(a)/3; 

の違いは何ですか?私にはStroustrupによって書かれたいくつかのスニペットで見ましたが、私は参照を見つけることができません。

+6

'a'が' int'のとき、 'static_cast (a)'と '(double)a'と' double(a) 'はすべて意味的に同じです。 'a'が他の非スカラー型、' const'や 'volatile'などのときに違いが現れます。 – ildjarn

+0

@ildjarnとパフォーマンスの観点から? –

+1

同一であることを意味します。違いはありません。 – ildjarn

答えて

10

誰かがキャスティングではなく構成していると思っているかもしれません。考えてみましょう:

some_fun(std::string("Hello")); 

多くの人が、実際にはCスタイルのキャストを行っているときにコンストラクタを呼び出していると思います。キャスティングでは、対象の型のコンストラクタが、見た目の長いリストの中で見えるので、最終的にコンストラクタを呼び出すことになります。

機能の表記は、Cキャストの他の種類のすべての同じ弱点を持つキャスト:

  • がうっかり離れてキャストすることができますconst性
  • は黙っ
  • キャスト再解釈になることができますgrepをして区別しにくいですツール。

これ以外にも、どちらの場合もまったく同じ操作を実行しています。

1

static_castを使用すると安全なC++スタイルの方法ですが、(ダブル) - 安全でない古いCスタイルの方法です。

はこちらをご覧ください:Type Casting

7

後者は明示的adoubleとして扱われるべきであると言う明示的なキャスト関数表記と呼ばれています。このテクニックを使って、どんなタイプにもキャストすることができます。

前者は、C++で型をキャストするのに好ましい方法です。これは、キャストしている型が意味をなされることを確認するための基本的なチェックを行います(子クラスが基本クラスのポインタなどへのポインタ)。また、表示されている例のように、暗黙の変換を実行できます。技術的には、例のstatic_castは明示的ですが、操作の結果(割り当て)は暗黙的です。

3

static_cast<double> (a)(double) aの間に生成されたアセンブリコードの点で違いはありません。キャスト記法の重要な利点は、(type_id) cast_expressionです。それはより柔軟です。 1つの状況では、const_cast、別の実施形態ではstatic_cast、さらに別ではdynamic_cast、さらに別の実施形態では、const_caststatic_cast(またはdynamic_cast)との組み合わせであってもよい。

この強度も弱いです。キャスト表記とは、異なる場所で異なることを意味します。別の欠点は、xxx_cast<type_id> (cast_expression)を見つけるのが非常に簡単であるということです。 _castを検索してください。キャスト表記を使用する式を見つけることは非常に難しいです。

関連する問題