在C ++中声明指向对象的指针实际上是什么意思?

时间:2019-03-22 02:23:36

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

这是一个有教育意义的问题:

如果我创建了一个课程

class bank_account

在主函数中,我声明了

bank_account *pointer = new bank_account();

然后我要初始化如下变量

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

我的困惑是在这里发生的事情,因为我通常用一个名称而不是指针来声明一个对象,如果该对象是一个指针,而指针只是一个保存变量地址的变量。如果将指针声明为对象及其实际代表什么是什么意思?指向对象的指针是否指向不可见的对象?

3 个答案:

答案 0 :(得分:3)

  

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

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

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

  

如果将指针声明为对象是什么意思

目前还不清楚您所说的“声明为对象” 是什么意思。如果您声明的指针的类型为bank_account*,则意味着它可以指向类型为bank_account的对象,该对象恰好是一个类。

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

  

它实际代表什么?

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

  

然后我要初始化如下变量

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

要学究,从技术上讲,这不会初始化一个变量。创建对象时对它们执行初始化。该成员变量是较早创建的,并且此表达式为赋值一个值。但是,如果该变量以前未初始化过,那么通俗地说,谈论初始化并不是完全错误。

  

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

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

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


  

您说对象已创建

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

  

但是我声明了一个指针

是的。你做到了。

  

所以指针指向对象?

您已经用new-expression的结果初始化了指针的值。指针指向动态存储中创建的对象。

  

那对象的名字是什么?

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

答案 1 :(得分:1)

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

创建类对象时,它也驻留在内存中,并根据需要占用任意多个字节。指针被分配了该类对象的地址值。

bank_account *pointer = new bank_account();

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

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

或等效地

pointer->account_name ="Random Name";

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

答案 2 :(得分:0)

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

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

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

您必须注意内存泄漏。由于此对象不会自动删除,因此您必须在必要时自己进行操作,否则程序运行的时间越长,它将使用更多的内存,直到用完它。

您还可以有多个指向同一位置的指针,这在迭代链接列表,数组和各种结构时非常有用,因此指针的目的并不一定要持有特定的对象,而是一种有效浏览内存中数据的工具。