我之前一直使用 Java,现在开始转向 C++。
我发现使用 C++ 的人经常用指针表示对象,比如像下面这样:
Object *myObject = new Object;
而不是,
Object myObject;
或者在调用成员函数的时候,都会这样:
myObject->testFunc();
而不是,
myObject.testFunc();
我有点想不明白为什么这么做?是出于效率方面么?
对于现代 C++ (尤其是 C++ 11 之后),大量使用 new 动态分配是不明智的选择。
下面从两个方面来解释:
上面两种创建对象的语句有什么不同呢?
对于 Object myObject;
,该对象被创建在栈上,它的特点就是脱离作用域后会自动销毁。而对于 new Object()
,它会在堆上动态创建一个对象,它的特点就是即使脱离作用域,该对象也会一直存在,除非你手动释放(delete)它,否则就会出现内存泄漏。
Object myObject;
的语法。当你确实要用动态内存分配的话,我们应该用智能指针或者其它的 RAII 技术来管理这部分资源。
不过,除了动态分配内存之外,原始指针还有其它用途。
class Base { ... };
class Derived : public Base { ... };
void fun(Base b) { ... }
void gun(Base* b) { ... }
void hun(Base& b) { ... }
Derived d;
fun(d); // oops, all Derived parts silently "sliced" off
gun(&d); // OK, a Derived object IS-A Base object
hun(d); // also OK, reference also doesn't slice
std::optional
,那么这个问题也可以得到解决。#include "B.h" // 必须 include 来包含类 B 的定义
class A; // 只需 A 的前向声明即可
func(A* a, B a)
{
}