15

コード内でC++スタイルのキャスト演算子を使用することは非常に満足していますが、舞台裏で何が起こっているのかを本当に理解しているとは言えません。私は基本的に、次の短いプロセス中にポインタに実際に何が起こっているのか疑問に思っています。

class A {};
class B : public A {};
class C : public B {};

A* pC = new C();

B* b = static_cast<B*>(pC);    // Is the value of pC changed by the cast?
C* c = static_cast<B*>(pC);    // Is the value of pC changed by the cast?
B* b2 = static_cast<B*>(c)     // Is the value of c now equal to the value of b2?

pCが指すオブジェクトは常に型であることに気付きましたCが、最初のキャストが行われた後、に格納されているアドレスbはもはや。のアドレスと等しくないと思いpCます。しかし、キャストが変更された場合、pC私の仮定の値は間違っています。一言で言えば、キャスト演算子は実際にキャストするポインタのアドレスを変更できますか?これはかなり簡単な質問に思えるかもしれませんが、私の考えでは、継承階層を持つオブジェクトがメモリ内にどのように格納され、ポインタがキャストを介してどのように操作されるかが明確ではありません。

私の頭の中では、pCいくつのキャストが実行されてもの値は変わりませんが、この考え方は正しいですか?

4

4 に答える 4

27

キャストされたポインターは、別の場所を指すことができます。たとえば、多重継承の場合。よく読んだ

元のポインタは保持されます

于 2012-07-25T14:37:23.347 に答える
5

キャストによってオペランドが変更されることはありません。コンパイラがオペランドを認識する方法を変更するだけです。

の値はpC変更されません。キャストの結果は、同じ値であるが型が異なる場合 (たとえば、 aconst_castまたは aの場合reinterpret_cast)、または実際には異なる型異なる値の両方である場合があります (たとえば、static_cast多重継承の場合の a の場合)。 、アンドリューの答えを参照してください)。

どの場合に異なる結果値が発生するかを本当に理解するには、C++ ABI、つまりオブジェクトがメモリに正確に格納される方法を読む必要があります。

于 2012-07-25T14:36:43.020 に答える
4

あなたの場合、ポインターは変更されません。

ただし、多重継承の場合は、ポインターを変更する必要があります。

それを確認するためのサンプル プログラムを作成できます。

于 2012-07-25T14:39:36.437 に答える
-2

簡潔な答え:

キャストを使用すると、オブジェクトをどのように解釈するか、つまり、オブジェクトがどのタイプであると考えられるかをコンパイラに伝えるだけです。

キャストはオブジェクトの値を変更しません。

于 2012-07-25T14:40:48.307 に答える