首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中声明一个指向对象的指针到底是什么意思?

在C++中声明一个指向对象的指针到底是什么意思?
EN

Stack Overflow用户
提问于 2019-03-22 10:23:36
回答 3查看 178关注 0票数 0

这是一个教育问题:

如果我创建了一个类

代码语言:javascript
复制
class bank_account

在main函数中,我声明了

代码语言:javascript
复制
bank_account *pointer = new bank_account();

然后,我初始化变量,如下所示

代码语言:javascript
复制
(*pointer).account_name ="Random Name";

我的困惑之处在于,如果一个对象是一个指针,而指针只是一个保存变量地址的变量,那么我通常会用名称声明一个对象,而不是一个指针。如果一个指针被声明为一个对象,这意味着什么?它实际表示的是什么?指向某个对象的指针是否引用了一个不可见对象?

EN

回答 3

Stack Overflow用户

发布于 2019-03-22 10:41:33

和指针只是保存变量地址的某个变量

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

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

如果将指针声明为对象,这意味着什么

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

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

和它实际代表的是什么?

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

,然后我初始化变量,如下所示

(*pointer).account_name =“随机名称”;

从技术上讲,这并不会初始化一个变量。在创建对象时对其执行初始化。此成员变量是先前创建的,此表达式为其赋值。但是如果变量之前是未初始化的,那么通俗地说,谈论初始化并不是非常错误的。

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

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

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

你说过会创建一个对象

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

,但我声明了一个指针

是。你做到了。

,所以指针指向对象?

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

,那么该对象的名称是什么呢?

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

票数 3
EN

Stack Overflow用户

发布于 2019-03-22 10:36:50

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

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

代码语言:javascript
复制
bank_account *pointer = new bank_account();

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

代码语言:javascript
复制
(*pointer).account_name ="Random Name";

或等同于

代码语言:javascript
复制
pointer->account_name ="Random Name";

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

票数 1
EN

Stack Overflow用户

发布于 2019-03-22 11:39:45

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

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55291991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档