您何时想在C++中使用指针与值?

Mit*_*rax 9 c++ pointers

我来自Java并试图学习C++.

据我所知,使用指针非常类似于引用变量在Java中的工作方式,因为您将内存地址传递给值.所以我觉得我对他们有了很好的理解.我也明白这些变量存储在堆上.

但是,我看到有另一种方法可以在C++中声明变量,而新的操作符/指针只是执行以下操作:

Employee boss("Frank");
Run Code Online (Sandbox Code Playgroud)

这将创建一个以"Frank"作为参数的Employee值.这些变量存储在堆栈中.

那么,你有两种截然不同的创建变量的方式,它们都有自己独特的行为(内存管理也是如此?).

我的问题是,何时使用指针VS值是否合适?什么是最佳做法?我怎么知道我想以什么方式在大多数时候声明我的变量?

Joh*_*kin 6

C++指针的运行方式与Java对象完全相同,因为它们可能无效(NULL)并且传递给程序很便宜.

C++引用是指针的一个薄包装器.它们不应该是无效的,但在某些情况下可能是无效的.例如,可以从NULL指针创建引用,或者可以删除它引用的内存.

在代码示例中,您给出:

Employee boss("Frank");
Run Code Online (Sandbox Code Playgroud)

你正在使用一种叫做"价值"的东西.与指针和引用不同,值它们所代表的对象,而不是间接.

我的问题是,何时使用指针VS [值]是否合适?什么是最佳做法?我怎么知道我想以什么方式在大多数时候声明我的变量?

C++没有垃圾收集,因此在变量范围有限时使用值.例如,不是为过程中的每个变量分配一个new并取消分配delete,而是可以在堆栈上分配它们而不用担心内存.


Sma*_*ery 5

这里有两个不同的问题:创建对象和引用它们。

创造

创建对象有两个地方:堆栈和堆。如果您使用您描述的语法:

Employee boss("Frank");
Run Code Online (Sandbox Code Playgroud)

将在堆栈上创建它。如果你这样写:

Employee* boss = new Employee("Frank");
Run Code Online (Sandbox Code Playgroud)

它将在堆上创建它。如果您不熟悉堆栈和堆的概念,那么成为一名优秀的 C++ 编码员至关重要,因此请了解它!

参考

指代对象有些不同。不管对象是如何创建的,都可以使用指针或引用(或只是标准变量)来引用它。在 C/C++ 中使用引用和指针实际上是一回事,尽管有重要的区别。

使用指针或引用时,不会制作对象的副本。

// No copies made:
Employee& frank = boss;  // Using References
Employee* frank = &boss; // Using a Pointer
Run Code Online (Sandbox Code Playgroud)

当您两者都不使用时,就会制作一份副本。

// Copy is made:
Employee frank = boss;
Run Code Online (Sandbox Code Playgroud)

那么什么时候使用指针,什么时候使用引用呢?我发现一个好的做法是只在有意义的时候使用指针null。如果某些内容不应该为空,请将其作为参考。


jld*_*ont 0

两种不同的野兽:如果您通过指针分配,您最终会得到 n 对 1 的关系,您必须通过适当的资源管理来处理这种关系。这通常是在 Java 中处理的。

在您所谓的“参考对象”中,您会获得不同的对象(需要跟踪等)。