gpt4 book ai didi

c++ - 静态、非成员或静态非成员函数?

转载 作者:可可西里 更新时间:2023-11-01 17:10:48 26 4
gpt4 key购买 nike

每次我有一些“实用”方向的功能时,我最终都会想知道哪个选项是最好的。例如,在我工作的上下文中打印消息结构(自己的或外部的)、一些编码/解码代码或一些有用的转换函数。

我考虑的方案是:

1) 辅助类/结构中的静态函数。

struct helper
{
static bool doSomething(...);
};

2) 非成员函数。

namespace helper
{
bool doSomething(...);
}

3) 静态非成员函数。

namespace helper
{
static bool doSomething(...);
}

在某些情况下,可能需要在“实用程序”中初始化或保持状态,因此我选择选项 1 以避免“全局”状态。但是,如果没有需要保留的状态,我应该选择 2 还是 3?选项 2 和选项 3 之间的实际区别是什么?

什么是需要考虑的重要因素?是否有首选方法来解决这个问题?谢谢!

最佳答案

选项 2 和 3 之间的区别在于,在第二种情况下,该函数将在翻译单元内部。如果函数仅在 cpp 中定义,这应该是一个选项(这大致相当于一个未命名的命名空间——这是要考虑的第四个选项,同样大致相当于 3)。

如果该函数要被不同的翻译单元使用,那么您应该选择选项 2。该函数将被编译一次(除非您将其标记为 inline 并在 header 中提供定义) ,而使用选项 3,编译器将在每个翻译单元中创建它的内部拷贝。

对于选项 1,我会避免它。在 Java 或 C# 中,您被迫在任何地方都使用类,当操作不能很好地映射到对象范例时,您最终会使用实用程序类。另一方面,在 C++ 中,您可以将这些操作作为独立函数提供,无需添加额外的层。如果您选择实用程序类,请不要忘记禁用对象的创建。

函数是在类级别还是命名空间级别会影响查找,这会影响用户代码。静态成员函数需要始终使用类名进行限定,除非您在类范围内,而将命名空间函数引入范围的方法有多种。作为说明性示例,请考虑一堆数学辅助函数和调用代码:

double do_maths( double x ) {
using namespace math;
return my_sqrt( x ) * cube_root(x);
}
// alternatively with an utility class:
double do_maths( double x ) {
return math::my_sqrt(x) * math::cube_root(x);
}

你觉得哪个更容易阅读是另一回事,但我更喜欢前者:在函数中我可以选择命名空间,然后只关注操作而忽略查找问题。

关于c++ - 静态、非成员或静态非成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com