如果我们看一下GNU实现的libstdc++,我注意到在各种类的标准实现中,私有成员函数都以
我理解使用某种命名约定来区分私有成员变量和函数局部变量的动机。但我不明白为什么私有成员函数更喜欢使用
如果我看到某些代码调用了例如:
1. 它是这个类的成员函数 2. 它是父类的成员函数 3. 它是全局函数。
前两个都有前缀,所以没有帮助。最后一个由于命名空间污染问题,在任何理智的实现中不会发生。库应该引入的唯一全局变量是标准规定的变量。所以这里的关键问题是...
由于私有成员函数不能公开访问,也不能影响派生类。我认为名称冲突在这里并不是真正的问题...基本上这些只是私有实现细节。为什么要费心(在我看来)丑陋的
_M_
为前缀。例如,std::basic_string<>
有一个叫做bool _M_is_shared() const;
的成员,还有其他的成员。我理解使用某种命名约定来区分私有成员变量和函数局部变量的动机。但我不明白为什么私有成员函数更喜欢使用
_M_
前缀。如果我看到某些代码调用了例如:
is_shared();
,那么基本上只有几个选项:1. 它是这个类的成员函数 2. 它是父类的成员函数 3. 它是全局函数。
前两个都有前缀,所以没有帮助。最后一个由于命名空间污染问题,在任何理智的实现中不会发生。库应该引入的唯一全局变量是标准规定的变量。所以这里的关键问题是...
由于私有成员函数不能公开访问,也不能影响派生类。我认为名称冲突在这里并不是真正的问题...基本上这些只是私有实现细节。为什么要费心(在我看来)丑陋的
_M_
前缀?标准中是否有禁止引入额外私有成员的规定?如果是这样,除非我漏掉了什么,否则这会让我感到愚蠢。
__foo
表示局部变量和参数,使用_M_foo
或_S_foo
表示成员变量,但在两种情况下,我们都必须使用保留名称来确保不与用户定义的任何宏发生冲突。 - Jonathan Wakely