9

これを作るもの

long l = 1;
char c = static_cast<char>(l);

float f = 1.0f;
int i = static_cast<int>(f);

これより良い

long l = 1;
char c = (char)l;

float f = 1.0f;
int i = (int)f;

あるプリミティブデータ型を別のプリミティブデータ型にキャストするときは?

同様の状況で型キャストに2番目のスタイルを使用するレガシーコードがたくさんあるので、これは、そのコードの本格的なリビジョンを実行するかどうかについての質問でもあります。

4

5 に答える 5

25

将来を保証します。

将来、私がこれを行うとしましょう:

float blah = 1.0f;
float* f = &blah;

ここで、int i = static_cast<int>(f);コンパイルを停止しますが、をint i = (int)f;実行しreinterpret_castます。

static_cast<int>これはまさに私があなたにしてほしいことです(int)私にintを取得するためにできることは何でもします。後者の場合、コンパイラーは値を取得するために邪魔になりませんが、intそれが望ましいことはめったにありません(決して?)。

于 2012-07-25T16:20:41.137 に答える
8

毎回、ちょっとした目安になります。

プリミティブ型間で頻繁に変換するべきではないので、毎回数文字余分に入力するのは非常に面倒な作業です。危険な活動をするたびにヘルメットをかぶらなければならないと不平を言うようなものです。ヘルメットの着用が煩わしい場合は、ヘルメットの要件ではなく、危険な活動を頻繁に行っていることが問題である可能性があります。

レガシーコードへの対処については、この質問でいくつかの回答(私自身を含む)を確認できます。

于 2012-07-25T16:35:18.960 に答える
7

はい、そうすべきです。

キャストはバグの主な原因です。これらは、プログラマーが利用できる最高のバグキャッチャーの1つである型システムを回避する方法です。

static_castは、古いcスタイルのキャストよりもはるかに見やすく、より具体的です。あなたは彼らを目立たせたいのです。デバッグするときに、それらを明確にする必要があります。次のプログラマーに、なぜそれをしているのかを理解してもらいたいと思います。

入力が難しいという事実static_cast<blah>(foo)も、絶対に必要な場合にのみキャストするように促すので、利点です。

于 2012-07-25T16:22:33.827 に答える
3

コンストラクターキャストは代替手段です。変換コンストラクターが定義されていると仮定します。例えば:

int i(0);
float f(3.14F);
i = int(f);

ただしstatic_cast、基本的に「何かが機能するまですべてのキャストを試してください」と言っているため、Cスタイルのキャストよりも他のC ++キャストを選択する必要があります。これにより、最終的にはareinterpret_castと同等になり、おそらく誤った動作が発生します。

于 2012-07-25T16:36:25.313 に答える
1

Cスタイルのキャストの問題は、意図しない変換を実行できる可能性があることです。

これは将来あなたがすべきことですが、問題が見つからない限り、私は戻って変更することはしません。

于 2012-07-25T16:19:38.953 に答える