通过不可复制的课程

时间:2013-11-15 17:55:25

标签: c++ pointers reference

我正在读一本书,作者有一个不可复制的类,最终成为另一个类的成员变量。由于作者的方式并且因为他更喜欢指向引用的指针,所以它对我很有用。让我举个例子。

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;
};

此外,我读过更喜欢引用指针,为什么不这样呢?

我相信这三个例子正在完成同样的任务。我错过了什么吗?为什么作者在这个例子中更喜欢指向引用的指针?最后,这个用法有名称吗?

3 个答案:

答案 0 :(得分:2)

传递引用会阻止您将NULL指针传递给构造函数。它保证在创建过程中存在对象。

答案 1 :(得分:1)

将引用作为数据成员通常是不愉快的,因为它们必须在初始化列表中初始化(在对象创建时,这有一些含义,例如类型是不可赋值的)。保持指针通常是一个更好的主意 - 尽管如果它是一个拥有指针,那么也可以使用std :: shared_ptr或std :: unique_ptr。

至于为什么他通过引用使用了take,然后他取了地址,好吧,这是为了避免引用作为数据成员并保持接口调用简单(这样arg而不是& arg可以是使用。)

答案 2 :(得分:1)

我对作者意图的猜测是,引用而不是指针意味着我们在对象创建时保证地址包含有效对象。指针的存储使对象可以复制,并且如果需要,可以重新绑定。

虽然没有一种方法可以保证在创建对象后传递的对象保持有效。