类中的奇怪实例化
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
,程序是否会更好?
它是对指针的引用。指针是一种数据类型,为什么不允许引用指针?
它与任何其他类型的引用的含义相同 - 它是指针的别名。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞