C++函数和方法风格

C++ functions and methods style

本文关键字:风格 方法 函数 C++      更新时间:2023-10-16

例如,我们有一个函数,它的结果是一个数组。我经常看到这样的东西:

void func(some_args, result_array){//some code//} 

因此,正如您所看到的,函数不返回数组,我们将其作为参数传递。

第二种情况如下:

float* func(some_args){ //some code// return result_array;}

有什么惯例吗?或者这只是关于个人偏好?我个人注意到,返回数组的第二个声明非常罕见。这有什么原因吗?

UPD:很抱歉不准确。当然,在第二种情况下,我暗示了一个指向数组的指针。

区别在于所有权。

void func(some_args, float*);

float* func(some_args);

在第一种形式中,很清楚谁负责为数组提供内存。第二个原因是不明确的:你调用的函数是否拥有内存,或者它是否被传递给你。谁负责delete[]?

char* s = strdup("hello");
// I have to remember to 'free()' what was strdup'd
// but what if I think "this is C++" and delete[] it?

--编辑--

这可能在一定程度上促成了C++11s智能指针(std::unique_ptrstd::shared_ptr)的发展,因此比所讨论的两个更好的选择是使用其中一个。

std::unique_ptr函数(some_args);

这明确表示"我会把你要负责的东西还给你"。

数组是C++类型系统中的"二等"公民。

相反,您应该返回一个容器(例如std::vector),因为这些容器由该语言更统一地处理。

阵列的问题在于

  • 在大多数情况下,它们会"衰减"为指向第一个元素的指针,从而丢失大小信息
  • 数组的大小是编译时常数

std::vector是一个围绕动态分配数组的精简包装器,但可以像任何其他值类型一样传递给函数或进行操作,并且大小也是一个运行时值。当然,没有什么金科玉律可以永远适用。。。但在C中使用C++中的数组时,通常使用std::vector

关于有什么惯例吗

是的,这个问题有一个"惯例"。

大多数专业环境都有一个编码标准。还将有同行评审和(可能)静态分析器来检测和执行该标准。

例如,"谷歌C++风格指南"(猜猜它有多容易找到)确定了参数排序:

定义函数时,参数顺序为:输入,然后输出。

C/C++函数的参数要么输入到函数,要么输出从函数,或两者兼有。输入参数通常是数值或const引用,而输出和输入/输出参数将非常数指针。在对函数参数进行排序时,将所有在任何输出参数之前仅输入参数。特别是不要仅仅因为函数的末尾添加了新参数是新的;将新的仅输入参数放在输出参数之前。

这不是硬性规定。既是输入又是输出(通常是类/结构)搅乱了水,并且一如既往,与相关函数的一致性可能要求您改变规则。

我还想补充一点,已经编写了很多可能不符合本指南的代码。我的上一次演出坚持让程序员让他们的代码与任何相关的代码匹配。。。这不是一个"水晶般清晰"的目标。


你不恰当地陈述了你的第一个案例:

void func(some_args, result_array){//some code//} 

因此,让我尝试一个带有更多提示的演示:

谷歌C++风格指南讨论的惯例可能最好以的形式呈现

void func(T1 argIn1, 
          T2 argIn2, 
          const T3& argIn3,
          std::vector<T4>& argOut4);

因此,argIn1和argIn2通过值传递到func,并明确输入。

argIn3是const-ref,也是一个输入。这就是如何在不产生复制成本的情况下将大量输入传递给函数。

argOut4是通过非常量引用传递的,在这种情况下,它当然是输出,但可能被视为输入和输出。


有很多代码示例(如linuxapi等)中函数会返回一些内容。你可以自己计算,并决定是否有任何结果适用于你的努力。我可以找到很多(比如memcmp)返回值是重要结果的地方,但我觉得(我还没有确认)大多数(或者更多)历史函数都返回状态。。。成功时可能为0,错误时为-1,errno中有一个值可描述。

因此,现在,我更喜欢返回std::string。当返回的size()为0时,表示没有发生错误,否则,错误描述将捕获在字符串中。


你的第二个案例也陈述得很糟糕。函数和方法只能返回一件事。。。它可以是一个类或结构,并填充了信息,但函数语义只能返回单个项。

遵循风格指南(任何编码标准)是一件好事。几年来,我一直在关注谷歌风格指南的几个部分。它很容易与我的标准做法相结合。