C ++使用struct参数代替函数而不是多个参数?

时间:2015-10-13 20:48:07

标签: c++ function struct

有人认为使用类或结构传递参数有好处吗?

而不是

f(int,float,string)

有无

f(Args)

Argsstructintfloat成员string的位置。

优势很容易创建多个默认参数,而不必在添加新参数时更改函数签名。

6 个答案:

答案 0 :(得分:2)

  

有人认为使用类或结构传递参数有好处吗?

是的,我认为有很多优点。

在函数上使用大型参数列表会分散客户端代码与语义参数一致性的注意力,这可以在适当的structclass内更好地进行管理。

如果需要在以后添加其他(可能是可选的)参数,使用struct也会更灵活。

答案 1 :(得分:2)

明显的好处是对语义相关的数据项进行逻辑分组。

一旦这样做,在结构上添加一些(成员)操作,以保证你的不变量。

封装提高了代码的抽象级别,这使得维护/推理变得更容易。

另见Law Of Demeter

答案 2 :(得分:2)

是否使用包含在类/结构中的一个参数或多个参数取决于参数的含义。

结构使用不当:

struct Foo
{
   char const* source;
   char* destination;
};


Foo strcpy(Foo foo);

好好利用结构:

struct Point
{
   int x;
   int y;
};


int distanceFromOrigin(Point p) { ... }

而不是

int distanceFromOrigin(int x, int y) { ... }

答案 3 :(得分:2)

我认为最大的好处是不必依赖参数顺序。如果您经常更改接口,依赖于顺序是容易出错的,相反,如果您更改参数struct,则始终显式地将值分配给具有特定语义的成员变量。

以Direct3D11 ID3D11Device::CreateDepthStencilState为例:传递const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc比询问所需的所有参数要清楚得多。

此外考虑可修改性:您不需要在重构期间更改此方法签名,而只需更改基础数据结构。我发现这在协同工作时特别有用,有人指定界面而其他人必须实现它。

答案 4 :(得分:1)

我还认为使用结构更好:你可以通过参数类型和顺序绕过喧嚣。假设您有foo(A, B)(对于类型AB)。但仍然可以编译foo(b, a),具体取决于隐式构造等。

这个概念也可以使用某种Context类来概括。依靠C ++ 11可变参数模板,您可以传递一个"参数超集上下文"到一个子集。

答案 5 :(得分:1)

在这里做恶魔倡导者。这里也有缺点,主要是语义上的。首先,如果其中一些args通过引用传递,另一个通过常量引用传递,第三个通过const指针传递,第四个按值传递,则需要大量代码。需要您为参数struct显式编写move构造函数和默认构造函数,这将很快变得乏味。将成员添加到该结构中也是单调乏味的。