我正在读一本书,作者有一个不可复制的类,最终成为另一个类的成员变量。由于作者的方式并且因为他更喜欢指向引用的指针,所以它对我很有用。让我举个例子。
class Foo; // noncopyable
class WrapperFoo
{
public:
explicit WrapperFoo(Foo& x)
: mFoo(&x)
{}
Foo* mFoo;
};
作者所做的让我感到惊讶的是他通过引用传递了Foo对象,然后他获取了Foo对象的地址并构造了mFoo指针。为什么从带有指针结束的引用开始?
class Foo; // noncopyable
class WrapperFoo
{
public:
explicit WrapperFoo(Integer* x)
: mFoo(x)
{}
Integer* mFoo;
};
如果我想要一个指针,这似乎更直接(和相同)。我明白这可能只是偏好。
class Foo; // noncopyable
class WrapperFoo
{
public:
explicit WrapperFoo(Integer& x)
: mFoo(x)
{}
Integer& mFoo;
};
此外,我读过更喜欢引用指针,为什么不这样呢?
我相信这三个例子正在完成同样的任务。我错过了什么吗?为什么作者在这个例子中更喜欢指向引用的指针?最后,这个用法有名称吗?
答案 0 :(得分:2)
传递引用会阻止您将NULL指针传递给构造函数。它保证在创建过程中存在对象。
答案 1 :(得分:1)
将引用作为数据成员通常是不愉快的,因为它们必须在初始化列表中初始化(在对象创建时,这有一些含义,例如类型是不可赋值的)。保持指针通常是一个更好的主意 - 尽管如果它是一个拥有指针,那么也可以使用std :: shared_ptr或std :: unique_ptr。
至于为什么他通过引用使用了take,然后他取了地址,好吧,这是为了避免引用作为数据成员并保持接口调用简单(这样arg而不是& arg可以是使用。)
答案 2 :(得分:1)
我对作者意图的猜测是,引用而不是指针意味着我们在对象创建时保证地址包含有效对象。指针的存储使对象可以复制,并且如果需要,可以重新绑定。
虽然没有一种方法可以保证在创建对象后传递的对象保持有效。