Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;对函数使用结构参数而不是多个参数?_C++_Function_Struct - Fatal编程技术网

C++ C++;对函数使用结构参数而不是多个参数?

C++ C++;对函数使用结构参数而不是多个参数?,c++,function,struct,C++,Function,Struct,有人认为使用类或结构传递参数有好处吗 喜欢而不是 f(int,float,string) int distanceFromOrigin(int x, int y) { ... } 有 其中Args是struct和int,float,string成员 优点是易于创建多个默认参数,并且在添加新参数时不必更改函数签名 有人认为使用类或结构传递参数有好处吗 是的,我认为有很多优点 在函数上有大的参数列表将分散客户端代码对语义参数一致性的注意力,可以在适当的结构或类中更好地管理语义参数一致性 如果以后

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

喜欢而不是

f(int,float,string)
int distanceFromOrigin(int x, int y) { ... }

其中
Args
struct
int
float
string
成员

优点是易于创建多个默认参数,并且在添加新参数时不必更改函数签名

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

是的,我认为有很多优点

在函数上有大的参数列表将分散客户端代码对语义参数一致性的注意力,可以在适当的
结构
中更好地管理语义参数一致性


如果以后需要添加额外的(可能是可选的)参数,则使用
结构更为灵活。

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

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

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


另请参见

我还认为使用struct更好:可以通过参数类型和顺序来避免麻烦。假设您有
foo(A,B)
(对于类型
A
B
)。但是仍然
foo(b,a)
可能会编译,这取决于隐式构造等


这个概念也可以使用某种
上下文
类来概括。依靠C++11可变模板,您可以将“参数超集上下文”传递给子集。使用类/结构中包含的一个参数还是多个参数取决于参数的含义

结构的错误使用:

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


Foo strcpy(Foo foo);
struct Point
{
   int x;
   int y;
};


int distanceFromOrigin(Point p) { ... }
结构的良好使用:

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


Foo strcpy(Foo foo);
struct Point
{
   int x;
   int y;
};


int distanceFromOrigin(Point p) { ... }
而不是

f(int,float,string)
int distanceFromOrigin(int x, int y) { ... }

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

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

以Direct3D11函数为例:传递一个
常量D3D11_DEPTH_STENCIL_DESC*pDepthStencilDesc
比请求它所需的所有参数要清楚得多

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