主要动机是偏爱非成员非朋友函数有助于保持类尽可能简洁。请参阅 Herb Sutter 的文章:http ://www.gotw.ca/publications/mill02.htm 。
本文还包含对您问题另一部分的答案,将相应的get函数放在哪里。这是 C++ 的一个特性,称为参数依赖查找 (ADL)。来自 Herb Sutter,他称其为 Koenig 查询,尽管这个名字是有争议的(见下面的评论):
Koenig 查找说,如果您提供类类型的函数参数,那么要查找编译器需要查找的函数名称,不仅在本地范围等通常的位置,而且在包含的名称空间(此处为 NS)中参数的类型。
这是一个例子:
namespace MyNamespace {
class MyClass {... };
void func(MyClass);
}
int main(int aArgc, char* aArgv[]) {
MyNamespace::MyClass inst;
func(inst); // Ok, because Koenig says look in the argument's namespace for func
}
所以简而言之,您只需在与您的类相同的命名空间中声明 get 函数。
请注意,如果您必须明确提供模板参数,这不适用于模板化函数 - 请参阅这篇文章:https ://stackoverflow.com/a/2953783/27130