在C ++中混合函数定义中的指针和引用

时间:2015-08-04 11:13:54

标签: c++ oop pointers reference

我有一个函数有两个类的实例作为参数:

void cookPasta(const Tomato& tomato, const Meat* meat)
{
    if (meat != nullptr)
        cookPastaWithMeat(tomato, *meat);
    else
        cookPastaWithoutMeat(tomato);
}

如函数所示,始终需要Tomato的实例,而Meat是可选的,而nullptr则可以传递。cookPasta。我这样做是为了允许调用Meat函数,即使用户从未声明过 self.collectionView.performBatchUpdates({ let selectedItems = self.collectionView.indexPathsForSelectedItems()! self.picturesObject.deleteItemsAtIndexPaths(selectedItems) self.collectionView.deleteItemsAtIndexPaths(selectedItems) }, completion: {_ in}) 类的实例。

在函数签名中混合引用和指针是不好的做法吗?

3 个答案:

答案 0 :(得分:30)

使用这种方法你失去的一件事是可以传递一个临时的Meat,因为它的地址不能被采用。

为什么不使用重载,只需重命名cookPastaWithMeatcookPastaWithoutMeat

void cookPasta(const Tomato& tomato, const Meat& meat);
void cookPasta(const Tomato& tomato);

答案 1 :(得分:8)

你的实践很好

  • 您已使用const关键字。
  • 传递参​​考
  • 但是,使用C ++的pointer,第二个参数optional parameter feature会更好一些。 check out here

    void cookPasta(const Tomato& tomato, Meat* meat = nullptr)
    {
        if (meat != nullptr)
            cookPastaWithMeat(tomato, *meat);
        else
            cookPastaWithoutMeat(tomato);
    }
    

现在,同时调用相同的功能。

cookPasta(tomato); // meat will default to nullptr
cookPasta(tomato, meat);

答案 2 :(得分:3)

这是一个很好的做法,因为你有充分的理由这样做:指针可以nullptr,而必须始终传递引用。你正在优雅地利用它。

使用const表示该函数无法修改从调用者传递的参数;这也很好。