声明未初始化时指向对象的指针,它指向某个垃圾位置。如果使用相同的指针初始化任何数据成员,则数据成员在没有对象的情况下存在在哪里。因为对象可以有数据成员,而不是指向对象的未初始化指针。
我尝试在初始化其数据成员之前/之后打印未初始化的"指向对象的指针"的值。该值保持不变,这意味着他们仍然没有创建对象,并且指针指向任何垃圾值。
#include <iostream>
using namespace std;
class play {
public:
int runs;
};
int main() {
play *batsman; // Not initialized
cout<<batsman<<endl; // "0" means pointing to any garbage location
batsman ->runs = 10; // Which object's data member "runs" is been initialized?
cout<<batsman<<endl; // "0" still points to some garbage location
play obj;
batsman = &obj; // Initializing the pointer
cout<<batsman<<endl; // 0x7ffe76256e60
return 0;
}
我预计,如果指向对象的指针没有使用对象的任何地址进行初始化,那么它如何初始化或将值分配给类的数据成员。尝试将值分配给不属于任何对象的数据成员应该是运行时错误。
这应该是运行时错误。这是错误的,当你违反C++规则时,它通常是未定义的行为。未定义的行为意味着任何事情都可能发生,这并不意味着必须有错误,这并不意味着它不会"工作"。
未定义的行为是使编程C++困难的原因之一,因为当您的程序有错误时,它们的行为是不可预测的。未定义行为的优点是,这意味着编译器可以生成非常快的代码,因为它不必检查垃圾指针之类的东西,它只是假设所有指针都是有效的。