2013-11-15 29 views
2

我在读一本书,作者有一个不可复制的类,它以另一个类的成员变量结束。它突出了我,因为作者的做法,因为他喜欢指向参考。让我举个例子。传递一个不可复制的类

class Foo;   // noncopyable 
class WrapperFoo 
{ 
public: 
    explicit WrapperFoo(Foo& x) 
       : mFoo(&x) 
       {} 

    Foo* mFoo; 
}; 

笔者做了什么令我惊讶的是,他通过引用传递的Foo对象,然后他需要的Foo对象的地址和contructs的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; 
}; 

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

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

+2

一旦你有一个引用数据成员,你的类变得不可分配。 – dyp

回答

1

引用作为数据成员往往并不令人不快,因为它们必须在初始化程序列表中初始化(在创建对象时,这有一些含义,例如类型是不可分配的)。保留一个指针通常是一个更好的想法 - 尽管如果它是一个拥有指针,那么不妨使用std :: shared_ptr或std :: unique_ptr。

至于为什么他使用引用,然后他采取了地址,那么,它是为了避免作为数据成员的参考和保持简单的接口(以便arg而不是& arg可以是使用。)

1

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

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

1

传递引用可以防止将NULL指针传递给构造函数。它确保在创建过程中存在该对象。