当前位置: 首页 > 面试题库 >

什么时候使用指针,什么时候不使用指针?

漆雕疏珂
2023-03-14
问题内容

我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C
++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做:

class Foo {
    Bar b;
}

与此相反:

class Foo {
    Bar* b;
}

问题答案:

首先避免指针。

在以下情况下使用它们:

  • 您想使用Pimpl习惯用法或抽象工厂。
  • Bar实例实际上是由程序的其他部分管理的,而Foo该类仅需要能够访问它。
  • 您想推迟Bar对象的构建(即,您想 构建 之后 创建它Foo)。
  • 在您的业务逻辑中,Bar对象可能根本不存在。您也null可以在Java中使用。但是,也请检查boost :: optional。
  • Bar 实际上是基类,您需要实例是多态的。
  • 您碰巧正在使用一个倾向于将GUI小部件显示为指针的工具箱。示例可以包括(但肯定不限于)wxWidgets和GLUI。

在任何这些情况下(*),请使用智能指针开始,例如boost ::
shared_ptr
。否则,您可能迟早会忘记分配内存。知道自己在做什么之后,请逐案考虑哪种指针类型最好。

(*)任何情况–可能除外,有关GUI小部件的项目符号;在这种情况下,您的工具包很可能也会为您管理资源



 类似资料:
  • 问题内容: 我来自没有显式指针的语言,因此我不太了解它们的存在重点(无双关语)。 问题是,在大多数情况下,我不知道为什么要传递指向函数的指针。我确实知道,当您传递一个指针时,到处都会对该变量进行修改,但这有什么意义呢?为什么不修改值并返回结果呢? 例如,是一个函数,该函数接收和作为参数。我读过接口实际上是指针(是吗?),但是我没有得到的是为什么? 为什么我要指向作家?我没有修改它,只是在写它。而且

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 一般来说,当发现 CPU 的占用率和实际业务应该出现的占用率不相符,或者对 Nginx worker 的资源使用率(CPU,内存,磁盘 IO )出现怀疑的情况下,都可以使用火焰图进行抓取。另外,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下。 常用的火焰图有三种: lj-lua-stacks.sxx 用于绘制 Lua 代码的火焰图 sam

  • 问题内容: 我看到了很多有关JDBC / MySQL的“最佳实践”指南,它们告诉我指定setFetchSize()。 但是,我不知道何时指定以及要指定什么(语句,结果集)。 在这两个中,我应该指定什么? 从javadoc和oracle文档中,这是我对“何时”感到困惑的地方 Java文档 默认值由创建结果集的Statement对象设置。提取大小可以随时更改。 甲骨文文档 生成结果集后,对语句对象的提