2

derivedC++ で、一方が名前付きで、もう一方baseが最初の基本クラスである名前付きの2 つのクラスを想像してみてください。次のコードがある場合は、これが推奨されます。

base *b = init_value_here;
const derived *d = static_cast<derived *>(b);

また

base *b = init_value_here;
const derived *d = static_cast<const derived *>(b);

言い換えれば、constコンパイラが constness に昇格できるので、不要な場合は static キャストで除外する方が良いですか、それとも将来より簡単にb作成できるように制限を緩めるために含める方が良いですか?const

4

4 に答える 4

8

できればどちらでもない。基本クラスが完全に有用なインターフェイスを定義し、基本クラス ポインターのみを使用するように、クラスを設計します。

ただし、レガシー コードで立ち往生している場合もあります。その場合は、const にキャストしていることを明示的に説明します。

編集:非ポリモーフィックな状況が発生し、キャストを使用した解決策が適切な場合があることを明確にする必要があります。一般的に言えば、ダウンキャストはデザインの匂いかもしれませんが、何かが確実に間違っていることを常に示しているわけではありません。

于 2011-06-17T18:08:35.417 に答える
3

明確にするために、彼らは同じことをします。

const base *ここで、 a からa に変換する場合const derived *、後者のみが有効で、前者には aconst_castも必要です。base *a からa に変換する場合derived *、前者のみが有効です。それ以外の場合はconst、キャストが追加した -ness をキャストする必要があるためです。

私の好みはconst、明示的に必要でない限り、キャストで修飾子を使用しないことです。言い換えれば、コンパイラが許す限りコードを単純に保ちます。

もちろん、別の派生クラスのインスタンスである可能性がある場合は、このシナリオでdynamic_cast<>はなく使用する必要があります。static_cast<>b

于 2011-06-17T18:10:18.083 に答える
3

可能な限り明示的なキャストを最小限に抑え、それ以外はすべて暗黙的に行うように努めています。

したがって、私は前者を使用します (つまりconst、キャストに含めません)。

しかし、これは私の意見です。constそれはあなたの好みに合っているので、そこにも書くという意見があるかもしれません.

于 2011-06-17T18:25:58.143 に答える
3

ほんの一行のコードについては、あまり気にしません。将来変更bする場合const base*、コンパイラは問題のある行と変更する必要がある行を正確に通知します。そのため、どちらの方法でも利点はごくわずかです.1つは行を短くし、もう1つは、コードを変更する同じ関数に既に入っている場合に数秒の作業を節約できる可能性があります。constある行のコードが別の行の詳細に依存することをわずかに減らすため、そうすることが思いついた場合は入れます。しかし、コードが既に作成されている場合は、わざわざ変更するつもりはありません。

API を設計している場合は、API をconst変更するのが苦痛になる可能性があるため、可能な場所に配置します。この潜在的な将来の変化は苦痛ではないと思います。

于 2011-06-17T18:19:05.907 に答える