代码之家  ›  专栏  ›  技术社区  ›  Jason R. Mick

使用“static”关键字限制C++成员函数中的访问

  •  5
  • Jason R. Mick  · 技术社区  · 14 年前

    我理解拥有静态成员函数的一个好处是不需要初始化类来使用它们。在我看来,它们的另一个优势可能是不能直接访问类的非静态内容。

    例如,一个常见的实践是,如果您知道一个函数将具有不可更改的参数,那么只需标记这些常量即可。例如。:

    bool My_Class::do_stuff(const int not_to_be_changed_1,
                            std::vector<int> const * const not_to_be_changed_2)
    {
      //I can't change my int var, my vector pointer, or the ints inside it.
    }
    

    所以使用静态成员函数来限制访问是有效的吗?例如,假设您有一个函数

    void My_Class::print_error(const unsigned int error_no) {
      switch (error_no) {
        case 1:
          std::cout << "Bad read on..." << std::endl;
          break;
        //...
        default:
          break;
      }
    }
    

    在这里,我们不会访问类的任何成员变量。所以如果我把函数改为:

    static void My_Class::print_error(const unsigned int error_no) {
      switch (error_no) {
        case 1:
          std::cout << "Bad read on..." << std::endl;
          break;
        //...
        default:
          break;
      }
    }
    

    如果我无意中尝试访问我的一个私有var等,我现在会得到一个错误(除非我给自己传递一个类的实例,这是有目的的^ ^!)

    这是否是一种有效的技术,类似于主动生成不应更改常量的参数?

    它在效率或使用方面会有什么缺点?

    我问这个问题的主要原因是,我读过的大多数“静态”教程都没有提到以这种方式使用它,所以我想知道,考虑到它似乎是一个有用的工具,为什么不使用它有一个很好的理由。


    编辑1 :此用途的进一步逻辑理由:

    如上所述,我有一个函数打印错误。我可以使用名称空间:

    namespace MY_SPACE {
       static void print_error(...) {
          ...
       } 
    
       class My_Class {
          ....
          void a(void)
       }
    }
    

    但这是一个痛苦,因为我现在必须延长我所有的var声明,也就是说。

    MY_SPACE::My_Class class_1;
    

    从我的类中删除一个函数, 我班的一个成员。

    当然,功能有多个级别的访问控制:

    //can't change pointer to list directly
    void My_Class::print_error(std::vector<int> const * error_code_list) {...}
    
    //can't change pointer to list or list members directly
    void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
    
    //can't change pointer to list or list members directly, access
    //non-const member vars/functions
    void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
    
    //can't change pointer to list or list members directly, access
    //non-static member vars/functions
    static void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
    
    //can't change pointer to list or list members directly, access
    //member vars/functions that are not BOTH static and const
    static void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
    

    当然,这有点不典型,但为了减少程度,使用常量函数和常量变量也是如此。我看到过很多例子,人们可以使用const函数,但没有。但是有些人认为这是个好主意。我知道很多C++程序员都不理解const函数或静态函数的含义。同样,很多人也会理解这两者。

    那么,为什么有些人如此坚决地反对将它用作访问控制机制,如果语言/规范规定将其用作访问控制机制,就像它用于const函数等一样?

    4 回复  |  直到 12 年前
        1
  •  1
  •   David R Tribble    14 年前

        2
  •  5
  •   Mark Ransom    14 年前

        3
  •  3
  •   John Dibling    14 年前

    static

    const static-as-const

    print_error

    class MyClass
    {
    public:
      void print_error(const unsigned int error_no) const;
    };
    

    void MyClass::print_error(const unsigned int error_no) const
    {
      // do stuff
    }
    

    this mutable

        4
  •  1
  •   SingleNegationElimination    12 年前

    ::className::methodName ::friendFunctionName