我正在查看一些开源代码,他们在定义为的类中列出了一些奇怪的实例:
Obj *&obj;
我不知道这是可能的!这是什么意思,甚至做什么?在我看来,指针和参考符号应该抵消。但也许它做了一些我不知道的特别的事情?
查看代码,他们使用它,就好像实例是一个指针一样。即:obj->method()
。那么为什么他们包括&
?
我正在查看一些开源代码,他们在定义为的类中列出了一些奇怪的实例:
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)
) 更容易管理/阅读。
As to why a reference to a pointer was chosen in the program -- there's not enough context, but you can ask yourself if the program would be better if the member were declared t_object** const
?
它是对指针的引用。指针是一种数据类型,为什么不允许您引用一个指针?
它与任何其他类型引用的含义相同——它是指针的别名。