指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员

How a pointer to an object which is not initialized by an address of object assign value to data member of class?

本文关键字:对象 数据成员 分配 指针 地址 初始化      更新时间:2023-10-16

声明未初始化时指向对象的指针,它指向某个垃圾位置。如果使用相同的指针初始化任何数据成员,则数据成员在没有对象的情况下存在在哪里。因为对象可以有数据成员,而不是指向对象的未初始化指针。

我尝试在初始化其数据成员之前/之后打印未初始化的"指向对象的指针"的值。该值保持不变,这意味着他们仍然没有创建对象,并且指针指向任何垃圾值。

#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++困难的原因之一,因为当您的程序有错误时,它们的行为是不可预测的。未定义行为的优点是,这意味着编译器可以生成非常快的代码,因为它不必检查垃圾指针之类的东西,它只是假设所有指针都是有效的。