C++ 对象创建和绑定的奇怪结果
我错误地写了一些愚蠢的东西,令我惊讶的是它居然奏效了C++ 对象创建和绑定的奇怪结果,c++,this,dynamic-cast,C++,This,Dynamic Cast,我错误地写了一些愚蠢的东西,令我惊讶的是它居然奏效了 class A { public: void print() { std::cout << "You can't/won't see me !!!" << std::endl; } A* get_me_the_current_object() { return this;
class A
{ public:
void print()
{
std::cout << "You can't/won't see me !!!" << std::endl;
}
A* get_me_the_current_object()
{
return this;
}
};
int main()
{
A* abc = dynamic_cast<A*>(abc);
abc->print();
}
此外,
A* abc = abc->get_me_the_current_object();
abc->print();
看到这些示例是如何工作的,以及映射是如何完成的,我大吃一惊。有人能详细说明一下这些是如何工作的吗?提前感谢。
abc
未初始化,并指向内存中未定义的位置,但您的方法不会从*此
读取任何内容,因此不会崩溃
他们不会崩溃的事实几乎可以肯定是实现定义的行为。
< P>你犯了一个普遍的错误,认为未定义的行为和C++错误意味着你应该看到一个戏剧性的崩溃或者计算机着火。有时候什么事也没发生。这并不意味着代码“有效”,因为它仍然有一个bug,只是症状没有出现然而 但是,它是有效的,所以我假设上面的陈述被破坏为:A* abc;
abc = dynamic_cast<A*>(abc);
是的,您所做的只是将未初始化的指针转换为相同的类型,即不需要转换,因此编译器不做任何操作。指针仍然是相同的类型,并且仍然未初始化
这与此类似:
int i = i;
<>这是根据C++语法有效的,因为此指针未取消引用,因此代码“起作用”(或至少看起来起作用)
这类似于:
void function(A* that)
{
std::cout << "Hello, world!\n";
}
A* p;
function(p);
void函数(A*that)
{
库特反问:你为什么要这样做?这是未定义的行为
是虚拟的,然后调用它会试图取消引用abc
,然后你几乎肯定会崩溃。@juanchopanza,动态\u cast
不是UB,取消引用它来调用成员函数是UB。@JonathanWakely同意。我认为很多事情都很清楚……因此未定义的行为应该避免。它是未“定义实现”,因为这有一个非常具体的含义。如果它是由实现定义的,那么实现需要记录在这种情况下它们是否崩溃,但由于这是未定义的,它们可以做任何事情。您可能的意思是,它因实现而异,但它从未定义为具有特定的行为指针?您首先说它是未初始化的,不是空的。您声称有几件事是无效的:int i=i;
无效(因为它涉及复制未初始化的int
),在上一个示例中,调用函数(p);
也是无效的(无论函数
做什么),因为它涉及复制未初始化(无效)指针。这两个都是未定义的行为。@ JoaNehanWakely:正如你指出的,我犯了一个普遍的错误,认为未定义的行为和C++错误意味着你应该看到一个戏剧性的崩溃。谢谢你的美丽解释。
void function(A* that)
{
std::cout << "Hello, world!\n";
}
A* p;
function(p);