类中的奇怪实例化

Strange instantiation in a class

本文关键字:实例化      更新时间:2023-10-16

我正在查看一些开源代码,他们在定义为以下的类中列出了一些奇怪的实例:

Obj *&obj;

我不知道这是可能的!这意味着什么,甚至有什么作用?在我看来,指针和参考符号应该抵消。但也许它做了一些我不知道的特殊事情?

查看代码,他们使用它,就好像实例是一个指针一样。 即:obj->method() .那么为什么他们包括&呢?

这是对指针的引用。这样想:

A *pa = new A(); //pa is pointer to A
A * & rpa = pa; //rpa is reference to pa
rpa = nullptr;  //it modifies pa as well
if ( pa == nullptr )
{
     std::cout << "pa is nullptr" << std::endl;
}

它将在控制台上打印"pa is nullptr"。

如果您发现A * &难以阅读,则可以将 typedef 用作:

typedef A* PA;
PA & rpa = pa; //same as before

像你写的代码一样,它不会编译,因为它声明了对指针的引用,但引用是未初始化的。例如,以下代码无法编译:

string *&s;

(除非它是类中的成员),但这将:

string *p;
string *&s = p;

另一种可能性是,这只是一个错字,他们打算写Obj *obj; ;)

这是对指针的引用。毕竟,指针也是一个值。您可以使用它来重新分配调用方持有的指针。举例说明:

bool allocate(t_object*& p) {
  assert(0 == p);
  p = new t_object;
  ...
}

然后:

t_object* obj(0);
if (!allocate(obj)) {...}
// obj now points to something

有些人发现它更容易管理/阅读它最直接的替代方案(bool allocate(t_object** p))。

至于为什么在程序中选择了对指针的引用 - 没有足够的上下文,但你可以问自己,如果成员被声明为t_object** const,程序是否会更好

它是对指针的引用。指针是一种数据类型,为什么不允许引用指针?

它与任何其他类型的引用的含义相同 - 它是指针的别名。