我来自 Java 背景并开始使用 C++ 中的对象。但是我想到的一件事是人们经常使用指向对象的指针而不是对象本身,例如这个声明:
Object *myObject = new Object;
而不是:
Object myObject;
或者不是使用函数,而是说testFunc(),像这样:
testFunc()
myObject.testFunc();
我们必须写:
myObject->testFunc();
但我不明白我们为什么要这样做。我认为这与效率和速度有关,因为我们可以直接访问内存地址。我对吗?
很遗憾,您经常看到动态分配。这只是表明有多少糟糕的 C++ 程序员。
从某种意义上说,你有两个问题捆绑在一起。首先是我们什么时候应该使用动态分配(使用new)?第二个是我们什么时候应该使用指针?
new
重要的带回家的信息是,您应该始终使用适当的工具来完成工作。在几乎所有情况下,都有比执行手动动态分配和/或使用原始指针更合适和更安全的方法。
在您的问题中,您已经演示了两种创建对象的方法。主要区别在于对象的存储持续时间。在Object myObject;块内执行时,创建的对象具有自动存储持续时间,这意味着它会在超出范围时自动销毁。当您这样做时new Object(),该对象具有动态存储持续时间,这意味着它会一直保持活动状态,直到您明确delete它为止。您应该只在需要时使用动态存储持续时间。也就是说,您应该*始终*更喜欢在可能的情况下创建具有自动存储持续时间的对象。
new Object()
delete
您可能需要动态分配的主要两种情况:
当您确实需要动态分配时,您应该将其封装在智能指针或其他执行RAII的类型(如标准容器)中。智能指针提供动态分配对象的所有权语义。例如,看一下std::unique_ptrand 。std::shared_ptr如果你适当地使用它们,你几乎可以完全避免执行你自己的内存管理(参见零规则)。
std::unique_ptr
std::shared_ptr
但是,除了动态分配之外,原始指针还有其他更一般的用途,但大多数都有您应该喜欢的替代方案。和以前一样,除非你真的需要指针,否则总是更喜欢替代方案。
nullptr
std::optional
boost::optional
get