返回对指针的引用 - C ++

时间:2010-01-22 14:55:10

标签: c++ pointers reference

考虑以下课程。

class mapping_items
{
public:

    mapping_items(){}

    void add(const mapping_item* item) {
        items_.push_back( item );
    }

    size_t count() const{
        return items_.size();
    }

    const mapping_item& find(const std::string& pattern){
        const mapping_item* item = // iterate vector and find item;
        return *item; 
    }

private:
    mapping_items(const mapping_items&); // not allowed
    mapping_items& operator=(const mapping_items&); // not allowed
    std::vector<const mapping_item*> items_;
};

C ++ FAQ说,

  

尽可能使用参考,和   必要的指针。

所以在上面的示例中,我应该返回const mapping_item&还是const mapping_item*

我选择mapping_item&的原因是因为总会有一个默认的返回值。我永远不会有空回报。因此,引用清楚地表明它不能有空值。这是正确的设计吗?

4 个答案:

答案 0 :(得分:2)

存在问题 - 如果find()函数失败会发生什么?如果预计永远不会发生这种情况,那么你可以返回一个引用(如果它发生了则引发异常,尽管它不应该发生)。另一方面,如果它可能发生(例如在地址簿中查找名称),则应考虑返回指针,因为指针可以为NULL,表示查找失败。

答案 1 :(得分:1)

这对我来说似乎是一个合适的设计选择 - 就像C ++ FAQ状态一样 - 尽可能使用引用。 IMO,不必使用指针只是似乎使代码更难理解。

答案 2 :(得分:1)

是的,这是正确的设计。客户端可以依赖非空值。

在相关的说明中,其他一些类负责管理mapping_item的生命周期?

指针和所有权容易引起内存泄漏或更糟。您可能想要考虑是否确实需要存储指针,或者是否可以避免复制mapping_item,以避免内存泄漏。但是,如果需要管理子类的mapping_item,则必须使用指针。如果实例很大或需要共享,建议使用指针。

如果你真的需要指针,可以考虑使用boost :: shared_ptr&lt;&gt;而不是原始指针,无论是在您的类中还是作为参数类型,例如add()函数。

答案 3 :(得分:0)

有些人说,我同意,

  

如果值为NULL,则使用指针   和其他参考

至于你的例子,我可能会选择return const mapping_item;,所以按值,以避免引用临时,并希望我的编译器优化复制。