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

Chi*_*iel 15 c++ oop pointers reference

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

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

正如函数所示,Tomato总是需要一个实例,而是Meat可选的,nullptr而是可以传递一个实例.我这样做是为了允许cookPasta函数被调用,即使用户从未声明过Meat该类的实例.

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

Que*_*tin 30

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

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

void cookPasta(const Tomato& tomato, const Meat& meat);
void cookPasta(const Tomato& tomato);
Run Code Online (Sandbox Code Playgroud)

  • 我从不相信匿名肉:太像早上3点烤肉串了.但好点. (13认同)
  • 这是一种很好的做法. (2认同)

Kas*_*ala 8

你的实践很好

  • 你使用了const关键字.
  • 传递参考
  • 但是,第二个参数pointer可以使用optional parameter featureC++ 更好一些.看看这里.

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


现在,以两种方式调用相同的函数.

cookPasta(tomato); // meat will default to nullptr
cookPasta(tomato, meat);
Run Code Online (Sandbox Code Playgroud)

  • 除了你_不能"双向"调用相同的功能而不破坏对称性.你可能的意思是'cookPasta(西红柿,肉);`,在呼叫现场假设合理的类型.你现在看到为什么这不是好的做法? (8认同)