用类实例的指针初始化是C++中唯一的吗?

0 c++ pointers memory-management reference class-instance-variables

我们都知道,在 C++ 中定义新实例的最简单方法是下一个:

ClassName *obj = new ClassName();
Run Code Online (Sandbox Code Playgroud)

但是,这样的方式是不好的,更先进的人使用智能指针,如:shared_ptrunique_ptr等等......但是,如果看看他们的来源您可能会发现smart_pointers使用指针为创建新实例,而不是引用。

我也知道,使用指针不仅对于 C++ 中的干净源代码(设计规则)来说是一件坏事,而且指针确实会分配新的内存,因为任何指针都是一种void*类型。正确的大小取决于 CPU 架构,但以 x86 为例,它包含 4 个字节。

使用它比使用 references 相当昂贵&,它不需要为它们分配任何内存,这就是为什么在 C++ 自定义方法中使用引用更好。

所以告诉你所有这些信息,我想知道:

是否可以使用 C++ 中的引用定义新实例?如果没有,那为什么?

Arm*_*yan 6

恐怕你的帖子是一个又一个的误解。所以你要做的第一件事就是扔掉你读过的所有“书”,读一本关于 C++ 的好书

现在,试着回答你的问题。您不能“使用引用”创建对象。相反,您可以创建对现有对象的引用。

MyClass myobject;
MyClass& myreference = myobject;
Run Code Online (Sandbox Code Playgroud)

就像您可以创建一个指向现有对象(或不指向任何对象)的指针一样。请注意,它不是创建对象的指针。new 表达式执行以下操作:

new MyClass;
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以在“堆上”创建一个 MyClass 类型的新对象。但它毫无用处,因为你已经失去了它的所有句柄。您无法访问它。这就是为什么我们将这个对象(新返回的)的地址存储在一个指针中的原因。如果它是智能指针而不是普通指针,它会自动“知道”何时释放内存,即删除对象,具体取决于智能指针的类型。这就是说,您可以创建对它的引用,而不是存储新创建对象的地址:

MyClass& ref = *new MyClass;
...
delete &ref;
Run Code Online (Sandbox Code Playgroud)

引用是免费的(就内存而言)也是不正确的。当然, sizeof(reference) 将返回所引用对象的大小,但大多数实现将使用类似指针的逻辑来处理引擎盖下的引用。