C++函数和方法风格
C++ functions and methods style
例如,我们有一个函数,它的结果是一个数组。我经常看到这样的东西:
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_ptr
和std::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时,表示没有发生错误,否则,错误描述将捕获在字符串中。
你的第二个案例也陈述得很糟糕。函数和方法只能返回一件事。。。它可以是一个类或结构,并填充了信息,但函数语义只能返回单个项。
遵循风格指南(任何编码标准)是一件好事。几年来,我一直在关注谷歌风格指南的几个部分。它很容易与我的标准做法相结合。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- Qt VTK交互风格的信号到小部件
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 是否有一种替换C风格的Bool数组的标准方法
- C++函数和方法风格
- C++方法良好的编程风格
- 方法原型风格澄清
- 有没有一种方法可以从镶嵌图中提取文档的风格信息
- 为什么std::string方法的风格与STL的其他部分不同?
- 使用更小的函数来分解长方法-正确的风格/如何声明
- 目标C错误:C风格的方法内部类实现
- 一种使用不同风格的私有成员的方法