这是一个有教育意义的问题:
如果我创建了一个课程
class bank_account
在主函数中,我声明了
bank_account *pointer = new bank_account();
然后我要初始化如下变量
(*pointer).account_name ="Random Name";
我的困惑是在这里发生的事情,因为我通常用一个名称而不是指针来声明一个对象,如果该对象是一个指针,而指针只是一个保存变量地址的变量。如果将指针声明为对象及其实际代表什么是什么意思?指向对象的指针是否指向不可见的对象?
答案 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
为止,并且传递该对象所需要做的就是传递它的指针,相比而言,这是一个很小的数据做一些像复制对象这样的愚蠢的事情,这对于性能来说是巨大的。
您必须注意内存泄漏。由于此对象不会自动删除,因此您必须在必要时自己进行操作,否则程序运行的时间越长,它将使用更多的内存,直到用完它。
您还可以有多个指向同一位置的指针,这在迭代链接列表,数组和各种结构时非常有用,因此指针的目的并不一定要持有特定的对象,而是一种有效浏览内存中数据的工具。