我来自Java并试图学习C++.
据我所知,使用指针非常类似于引用变量在Java中的工作方式,因为您将内存地址传递给值.所以我觉得我对他们有了很好的理解.我也明白这些变量存储在堆上.
但是,我看到有另一种方法可以在C++中声明变量,而新的操作符/指针只是执行以下操作:
Employee boss("Frank");
Run Code Online (Sandbox Code Playgroud)
这将创建一个以"Frank"作为参数的Employee值.这些变量存储在堆栈中.
那么,你有两种截然不同的创建变量的方式,它们都有自己独特的行为(内存管理也是如此?).
我的问题是,何时使用指针VS值是否合适?什么是最佳做法?我怎么知道我想以什么方式在大多数时候声明我的变量?
C++指针的运行方式与Java对象完全相同,因为它们可能无效(NULL)并且传递给程序很便宜.
C++引用是指针的一个薄包装器.它们不应该是无效的,但在某些情况下可能是无效的.例如,可以从NULL指针创建引用,或者可以删除它引用的内存.
在代码示例中,您给出:
Employee boss("Frank");
Run Code Online (Sandbox Code Playgroud)
你正在使用一种叫做"价值"的东西.与指针和引用不同,值是它们所代表的对象,而不是间接.
我的问题是,何时使用指针VS [值]是否合适?什么是最佳做法?我怎么知道我想以什么方式在大多数时候声明我的变量?
C++没有垃圾收集,因此在变量范围有限时使用值.例如,不是为过程中的每个变量分配一个new并取消分配delete,而是可以在堆栈上分配它们而不用担心内存.
这里有两个不同的问题:创建对象和引用它们。
创建对象有两个地方:堆栈和堆。如果您使用您描述的语法:
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。如果某些内容不应该为空,请将其作为参考。
两种不同的野兽:如果您通过指针分配,您最终会得到 n 对 1 的关系,您必须通过适当的资源管理来处理这种关系。这通常是在 Java 中处理的。
在您所谓的“参考对象”中,您会获得不同的对象(需要跟踪等)。
| 归档时间: |
|
| 查看次数: |
2984 次 |
| 最近记录: |