【问题标题】:What does it actually mean to declare a pointer to an object in C++?在 C++ 中声明指向对象的指针实际上意味着什么?
【发布时间】:2019-03-22 02:23:36
【问题描述】:

这是一个教育问题:

如果我创建了一个类

class bank_account

在主函数中,我声明了

bank_account *pointer = new bank_account();

然后我初始化变量如下

(*pointer).account_name ="Random Name";

我的困惑是这里发生的事情,因为我通常用 NAME 声明一个对象,而不是指针,如果该对象是一个指针,并且指针只是一些变量,它保存一个变量的地址。如果将指针声明为对象以及它实际表示的内容,这意味着什么?指向对象的指针是指不可见的对象吗?

【问题讨论】:

  • “隐形”是什么意思?您无法“看到”它们仅存在于计算机内存中的对象。
  • 好吧,我声明了一个有名字的对象,对吧?那么当我将一个对象声明为指针时,指针指向的是什么?
  • 一个对象只是一个初始化的内存块。当您说new bank_account(); 时,系统分配并初始化了一块内存(一个对象),然后您将其地址分配给您的指针(它本身就是一个单独的对象)。这就是让你困惑的地方吗?
  • 除非你把它指向安全的东西,否则你可以安全地使用它。 bank_account *pointer; 如果您尝试使用它,它就是炸弹。但是如果你pointer = new bank_account();,那么pointer 指向一个内存块,其形状为bank_account,它已经构建并准备就绪。 bank_account 没有名字,只有一个地址。我敢肯定,这会极大地打扰六号。
  • 我建议阅读有关堆栈和堆的内容,这应该可以让您更好地了解它们的区别。

标签: c++ class pointers c++14


【解决方案1】:

而指针只是一些变量,它保存着变量的地址

更正:指针可以指向任何对象;不一定是变量。变量有名字。可能存在不直接由变量命名的对象,例如子对象、临时对象和动态存储中的对象。

例如,在您的程序中,表达式 new bank_account() 在动态存储中创建一个对象。

指针被声明为对象是什么意思

“声明为对象” 真的不清楚你的意思。如果你声明一个指针的类型为bank_account*,这意味着它可以指向一个bank_account类型的对象,它恰好是一个类。

如果将变量声明为指针类型,则该变量命名的对象就是指针。

它实际上代表什么?

指针表示对象的地址。除了包含对象的地址外,它还可以具有空指针值(不指向对象)或无效值(可能包含对象的地址,但该对象不再存在)。

然后我初始化变量如下

(*pointer).account_name ="Random Name";

为了迂腐,这在技术上并没有初始化变量。在创建对象时对其进行初始化。这个成员变量是之前创建的,这个表达式分配一个值给它。但是如果变量之前没有初始化,那么通俗地说,谈论初始化并没有什么大错。

当我将一个对象声明为指针时,指针指向的是什么?

在您的示例程序中,pointer 使用关键字new 指向在动态存储中创建的对象。

一般来说,指针指向某个对象,其地址存储在指针中,或者指针可能根本不指向对象(无效或空值)。


你说创建了一个对象

是的。 new-expression 在动态存储中创建一个对象。

但我声明了一个指针

是的。你做到了。

所以指针指向对象?

你已经用 new 表达式的结果初始化了指针的值。指针指向在动态存储中创建的对象。

那么那个对象的名字是什么?

对象没有名称。但是:变量确实有名称,并且变量与对象相关联,因此可以通俗地说,与变量关联的那些对象具有名称。但是动态存储中的对象不是由变量命名的。

【讨论】:

    【解决方案2】:

    指针是一个包含另一个变量地址的变量。任何指针都使用保持地址所需的内存空间。在 64 位平台上,它通常需要 8 个字节。

    当您创建一个类对象时,它也驻留在内存中并根据需要占用尽可能多的字节。指针被赋值为这个类对象的地址。

    bank_account *pointer = new bank_account();
    

    上面声明了一个指向bank_account类型对象的指针。 new 为内存中的对象分配空间并返回其地址。它还调用类的构造函数。 new 返回的地址被分配给名为pointer 的指针变量。稍后您可以使用它来访问对象

    (*pointer).account_name ="Random Name";
    

    或等效

    pointer->account_name ="Random Name";
    

    指针只是一个地址。指针类型只是一种语法糖,它允许编译器完成其工作并为您提供有关程序的有用信息。

    【讨论】:

    • 很好的解释,我意识到我做了一些错误的假设,现在我明白了如何看待整个事情
    【解决方案3】:

    指针是一个保存内存地址的变量,它存在于它指向有意义或没有意义的东西的任何地方,这意味着你可以声明这个指针,而不一定要实例化它指向的对象,它可以只是指向nullptr,这通常表示该对象当时不存在。仅此一项很有用。您可以将其用作占位符或跟踪程序的状态。

    另一个属性是它可以指向一个对象数组,因此您可以使用它一次创建动态数量的对象,而不仅仅是一个或预定数量的对象。

    但是最重要的属性是你用new 实例化的对象不属于那个特定的范围,如果函数结束它不会被自动删除。这个对象可以在子程序中创建,然后在程序的整个生命周期中存在,或者直到你delete它,你所要做的就是传递它的指针,与做相比,这是一个相当小的数据像复制对象这样愚蠢的事情,这对性能来说是巨大的。

    不过,您必须注意内存泄漏。由于这个对象不会自动删除,所以需要的时候必须自己动手,否则程序运行的时间越长,它会使用的内存越多,直到用完为止。

    你也可以有多个指针指向同一个地方,这在迭代链表、数组和各种结构时非常有用,所以指针的目的不一定是持有特定对象,而是一种高效浏览内存中数据的工具。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2017-06-03
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2022-12-12
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多