C++ 在C+中使用nullptr访问类成员+; #包括 #包括 使用名称空间std; 课堂检查 { 公众: int a{}; 字符串b{}; 浮点数c{}; 作废打印() { 库特

C++ 在C+中使用nullptr访问类成员+; #包括 #包括 使用名称空间std; 课堂检查 { 公众: int a{}; 字符串b{}; 浮点数c{}; 作废打印() { 库特,c++,class,pointers,C++,Class,Pointers,据我所知,我们可以通过指向类的指针访问类的成员,然后存储该类类型的对象的地址,然后我们可以使用该指针通过“->”访问成员 这是正确的。不过,除非您需要,否则您不会使用指针,而只使用对象本身: Check ptr; ptr.print(); 它是如何工作的,为什么没有任何错误 您不会收到错误,因为取消引用空指针是未定义的行为。编译器可能会在能够检测到问题的情况下发出警告,但不要求它们发出错误(通常不能) …或未定义的行为,即使我没有在其中存储对象的地址 你的代码确实有未定义的行为。未定义的行为意

据我所知,我们可以通过指向类的指针访问类的成员,然后存储该类类型的对象的地址,然后我们可以使用该指针通过“->”访问成员

这是正确的。不过,除非您需要,否则您不会使用指针,而只使用对象本身:

Check ptr;
ptr.print();
它是如何工作的,为什么没有任何错误

您不会收到错误,因为取消引用空指针是未定义的行为。编译器可能会在能够检测到问题的情况下发出警告,但不要求它们发出错误(通常不能)

…或未定义的行为,即使我没有在其中存储对象的地址

你的代码确实有未定义的行为。未定义的行为意味着你不能保证你的代码会做正确的事情。你不能保证你的代码会做错误的事情


在幕后,
this
指针作为隐式参数传递给成员函数。由于
print
实际上没有使用该类的任何成员,因此没有使用该指针,您的代码似乎正常工作。但是,这只是偶然的。根据语言的规则,
ptr->print();
已经是未定义的行为(无论<代码>打印< /COD>是否使用成员).< /P> < P>大多数C++将此(您正在引用的指针)作为隐式第一参数。在打印方法调用中,您从不引用此(函数不引用对象成员)。这就是为什么您的程序不会崩溃。如果引用对象成员或使print virtual,您的方法将崩溃,因为这是null。

为什么您认为这不是未定义的行为?这只是UB的最坏情况,它似乎可以工作。从技术上讲,您所做的是UB。因为
print()
不会对类的成员做任何事情。即使对象是垃圾,也可以合理地期望它只进行打印。UB的意思是,不保证会发生什么-也可能会发生某种正确的行为。未定义的行为意味着行为未定义,并不意味着它将L不是“工作”,或者它必须是一个错误。这里定义的是由C++标准定义的。当程序有未定义的行为时,任何事情都可能发生,编译器没有破坏C++标准的任何规则。