【发布时间】:2012-07-24 00:41:25
【问题描述】:
我很高兴在我的代码中使用 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 的值无论对其执行多少次强制转换都保持不变,但这种想法是否正确?
【问题讨论】:
-
有点不清楚你所说的“改变”是什么意思。 static_cast 是一个函数。它接受一个值并返回一个新值。 “更改”是指新值可能与旧值不同?
-
@VaughnCato 我期待返回的演员表分配的新指针不同,我想知道演员表是否影响传递给演员表的指针(在本例中为 pC)。我以静态转换为例,但我真的想知道是否任何转换都能够修改其指针-我想我要问的是转换是否将参数视为按值传递(或 const ref)-即不能修改它。
-
是的,static_cast的参数是传值。
标签: c++ inheritance pointers casting type-conversion