首页 > 解决方案 > 在方法中分配指针退出方法?

问题描述

我正在尝试学习 C++ 中的面向对象编程,但不明白为什么以下代码不会打印 hi:

#include <iostream>

class test {
  double *x;
  double y = 5;

public:
  void printhi() {
    *x = y;
    std::cout << "hi";
  }
};

int main() {
  test a;
  a.printhi();

  return 1;
}

这段代码没有给我任何输出。如果我只是删除指针分配,则std::out<<"hi";运行良好。为什么?在那里分配指针对计算机意味着什么?

标签: c++

解决方案


该成员x没有初始化程序。因此,如果类被默认初始化,它将被默认初始化。默认初始化指针具有不确定的值。

尝试通过不确定的指针分配不存在的对象,甚至读取该不确定的值具有未定义的行为。

在那里分配指针对计算机意味着什么?

您尚未分配指针。您已经通过指针间接,并分配了指向的对象。除了没有对象被指向,因为指针有一个不确定的值。程序的行为是未定义的。

如果我只是删除指针分配, std::out<<"hi"; 运行良好。为什么?

如果您删除未定义的行为,那么该程序的行为将是您所期望的。

我认为 *x=y 和 x=&y 是相同的分配

一点也不。首先通过指针赋值x并修改指向的对象,使其具有与 object 相同的值y。第二个修改指针x以指向对象y

*x=y不是 的分配x。它是 指向的对象的赋值x

然而 x 有一个无法赋值的不确定值

可以分配一个不确定的值。一旦分配,该值将不再是不确定的。这就是为什么x=&y会有明确定义的行为。它分配指针。

也就是说,分配一个对象指针成员指向另一个成员的有用性是值得怀疑的。


推荐阅读