给STL中常用的类成员名称的不良做法?

时间:2014-02-13 03:02:01

标签: c++ naming-conventions

除了保留字之外,给出与STL或C标准库名称相同(或类似)的成员函数或变量标识符是否有问题?使用这些名字有什么缺点?在哪些情况下这种做法是不可接受的?

为了更好地说明:

class Example
{
public:
    size_t size();
    bool empty();
    void erase(ctype end);
    int memset(const Example &);
private:
    typedef int lower_bound;
    std::vector<lower_bound> stack;
};

2 个答案:

答案 0 :(得分:2)

它可能被视为良好做法的原因是一致性。您希望用户能够拥有熟悉的界面,而不是“妨碍他们”。换句话说,您可以继续在标准库之后对类进行建模。在我看来,问题在于库是一个冗长的名称和接口。除非你污染全局命名空间,否则它确实没有必要,你不应该这样做。如果您的函数具有意外的副作用或者对用户通常期望它们的实现方式产生不利影响,您只需要偏离您的命名约定。有关您的用户如何尝试使用erase功能并希望它以这种方式运行的示例,请参阅Erase-remove idiom

答案 1 :(得分:2)

在您提供的示例代码中,唯一有问题的选择是memset,因为用户对e.memset(b)的含义并不明显。如果不清楚这意味着什么 - 只要名字对用户来说是明确的,这是一件好事。

现在问题在于,众所周知的名称可能比这个词实际意味着更多的意义。例如,您可以编写类似的容器类型:

class MyContainer {
   // ...
   void add(const Element& e);
      // Adds 'e' to the container
   bool isEmpty() const;
      // Returns true if the container is empty
   void empty();
      // Removes all elements from the container
};

虽然名称的选择没有任何明显的错误,但容器中的人们希望empty()成为一个检查,返回容器是否为空。这会使它成为一个不好的选择,因为它会产生混乱。

所以基本上可以使用相同的标识符,只要使用不冲突并且不会让其他开发人员感到困惑。