做一个C++;样式转换运算符是否更改它所转换的指针? 我很高兴在代码中使用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? A类{}; B类:公共A{}; C类:公共B{}; A*pC=新的C(); B*B=静态(pC);//演员阵容是否改变了个人电脑的价值? C*C=静态(pC);//演员阵容是否改变了个人电脑的价值? B*b2=static_cast(c)//现在c的值等于b2的值吗?

做一个C++;样式转换运算符是否更改它所转换的指针? 我很高兴在代码中使用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? A类{}; B类:公共A{}; C类:公共B{}; A*pC=新的C(); B*B=静态(pC);//演员阵容是否改变了个人电脑的价值? C*C=静态(pC);//演员阵容是否改变了个人电脑的价值? B*b2=static_cast(c)//现在c的值等于b2的值吗?,c++,inheritance,pointers,casting,type-conversion,C++,Inheritance,Pointers,Casting,Type Conversion,我意识到pC指向的对象始终是C类型,但在进行第一次转换后,我假设b中存储的地址不再等于pC的地址。但是如果强制转换改变了pC的值,我的假设是错误的。简言之,强制转换运算符实际上可以更改它们强制转换的指针的地址吗?这似乎是一个很容易回答的问题,但在我看来,这幅图并不清楚具有继承层次结构的对象是如何存储在内存中的,以及指针是如何通过强制转换进行操作的 在我看来,pC的值保持不变,无论对其执行多少次强制转换,但这种想法正确吗?在任何情况下强制转换都不会改变其操作数。它所做的只是改变编译器如何看待操作数

我意识到
pC
指向的对象始终是
C
类型,但在进行第一次转换后,我假设
b
中存储的地址不再等于
pC
的地址。但是如果强制转换改变了
pC
的值,我的假设是错误的。简言之,强制转换运算符实际上可以更改它们强制转换的指针的地址吗?这似乎是一个很容易回答的问题,但在我看来,这幅图并不清楚具有继承层次结构的对象是如何存储在内存中的,以及指针是如何通过强制转换进行操作的


在我看来,
pC
的值保持不变,无论对其执行多少次强制转换,但这种想法正确吗?

在任何情况下强制转换都不会改变其操作数。它所做的只是改变编译器如何看待操作数

pC
的值不会改变;强制转换的结果可能是相同的值但不同的类型(例如,在
常量强制转换
重新解释强制转换
的情况下),或者实际上可能是不同的类型和不同的值(例如,在多重继承的情况下,在
静态强制转换
的情况下,请参见Andrew的答案)


要真正理解在哪种情况下会产生不同的结果值,你必须读C++的ABIS,即对象是如何精确地存储在内存中的。

< P>指针可以指向另一个位置。例如,在多重继承的情况下


原始指针将被保留

在您的情况下,它不会更改指针

但是对于多重继承,它必须更改指针

您可以编写一个示例程序来确认这一点

简短回答:

使用强制转换,您只需告诉编译器如何解释对象,即我认为该对象是什么类型


强制转换不会改变对象的值。

我一直在等待答案。有点不清楚“更改”是什么意思。静态_cast是一个函数。它接受一个值并返回一个新值。“更改”是指新值可能与旧值不同吗?@VaughnCato我希望返回的强制转换分配的新指针不同,我想知道的是强制转换是否会影响传递给强制转换的指针(在本例中为pC)。我以静态cast为例,但我真的想知道是否有任何cast能够修改其指针-我想我要问的是,cast是否将参数视为pass by value(或const ref)-即不能修改它。是的,static_cast的参数是pass by value。虽然操作数确实从未更改,
static\u cast(0.1)
的结果并不意味着
0.1
被“看到”了任何不同。@LucDanton:在一般情况下。例如,
reinterpret\u cast(“123”)
(哦,人性!)被“视”为一个int。
const\u cast
的结果被“视”为非const。这正是我所指的。“一般情况下”的措辞要比“任何情况下”的措辞强硬得多。你可能想解决这个问题。@LucDanton:你太依赖非母语人士了。我会试着改写一下,好吗?我不是在歪曲事实。这是我读了你的答案后的真实反应:我以为你的意思是,不仅强制转换永远不会改变操作数,而且总是要改变操作数的显示方式。既然这不是你的意思(你确实说过“在一般情况下”),那么在我看来,最好的做法是选择明确的措辞。这一直是关于改进答案的(因为我们在评论中),我不是在询问演员阵容——我知道这是如何工作的。虽然技术上是正确的,但你的答案是误导性的。将指针强制转换到类实例可能会返回与强制转换指针所包含的不同的指针地址。