我们都知道,在 C++ 中定义新实例的最简单方法是下一个:
ClassName *obj = new ClassName();
不,我们不……因为它不是。
要创建 type 的新实例ClassName
,只需编写:
ClassName obj;
仅在需要时使用动态分配!
但是这种方法很糟糕,更高级的人使用智能指针,例如:shared_ptr、unique_ptr 等...但是如果查看它们的来源,您可能会发现 smart_pointers 使用指针来创建新实例,而不是引用。我也知道,使用指针不仅对 C++ 中的干净源代码不利(设计规则)
有哪些设计规则?没有“规则”,只有不同的人写的不同的指导方针,都有自己的观点。
我通常建议避免使用指针,因为它们的使用意味着动态分配,这更难管理。智能指针确实对此有所帮助,但它们不是使用动态分配的理由,否则您不会这样做。
指针也会分配新内存,因为任何指针都是 void* 类型。正确的大小取决于 CPU 架构,但对于示例,让我们以 x86 为例,它拥有 4 个字节。
嗯,这也不是真的。每个指针类型都是它自己的类型,它们不一定都是相同的宽度。但是,通常情况下可能会出现这种情况。
使用起来比使用引用 & 更昂贵,因为引用 & 不需要为它们分配任何内存,这就是为什么在 C++ 自定义方法中使用引用要好得多。
不,也不是真的。C++ 中的引用语法通过透明地执行它们来隐藏取消引用操作,但是您会发现所有实现/工具链/编译器无论如何都使用指针来实现引用。
您应该停止考虑“指针”与“引用”。也许您正在考虑 Java。
您应该考虑自动存储持续时间(“堆栈”)与动态存储持续时间(“堆”) - 前者效率更高,因为它不需要动态分配,但您失去了精细控制对象生命周期的能力.
是否可以在 C++ 中使用引用定义新实例?如果不是,那为什么?
如果您的意思是“如何在没有动态分配的情况下创建对象”,请参阅以下示例:
// automatic storage duration - cheap!
ClassName obj;
// dynamic storage duration - marginally more expensive,
// and now you have to `delete` it, too
ClassName* ptr = new ClassName;
在 C++ 中,引用就像一个“自动指针”;它做同样的工作,但没有所有的语法要求:
ClassName* ptr = &obj; // a pointer to obj
ClassName& ref = obj; // a reference to obj
new
运算符始终为您提供指向动态分配对象的指针,而不是引用。这就是它的方式。