【问题标题】:Static methods in C++C++ 中的静态方法
【发布时间】:2012-02-08 09:48:41
【问题描述】:

C++ 中的静态方法是什么意思? 据我了解,这与 Java 中的相同:无需创建类的实例即可调用静态方法。 我记得,在 C 语言中,我们使用静态声明方法来使它们成为私有的。 如何在 C++ 中创建私有方法? 假设我想使用辅助函数进行一些计算:

class A{ 
  foo();
};

A::foo(){
    int a=doSomCalculations();
}

我将如何定义 doSomecalculations 使其类似于 Java 中的私有辅助方法?

【问题讨论】:

    标签: c++ private


    【解决方案1】:

    正如您所说,静态方法不需要您拥有对象的实例。 该方法在该对象的实例之间共享。 在 C++ 中,您可以通过以下方式声明私有方法:

    class YourClass { 
      public:
      void publicMethod();
      private:
      void privateMethod();
    };
    

    【讨论】:

      【解决方案2】:

      您在文件范围内获得“静态”与类上下文中的“私有”混淆。

      为了使类中的方法或数据项是私有的,只需将其放在“私有”部分而不是类的公共部分,这样

      class Foo
      {
         private:
           int dosomething();
         public:
           Foo();
      };
      

      那么 dosomething() 只能在 Foo 的方法中调用。一个静态函数

         class Foo { public: static wibble(); }
      

      就像 Java satic 函数一样,您可以在没有 Foo 实例的情况下调用 Foo::wibble()。

      我认为在文件范围内使用静态已被弃用,我们鼓励使用匿名命名空间。

        static int iamrunninoutofnames() { .... }
      

      对于声明它的文件是全局的,但在该文件之外不可用。

       namespace { int iamrunninoutofnames() { .... } }
      

      效果类似,但如果你小心使用它会更灵活。

      【讨论】:

        【解决方案3】:

        在 C++ 中,如果您没有明确 声明某事物是public,默认情况下它将是private。因此,如果您希望 foo() 在您的班级中成为 public,您需要这样声明。

        class A{ 
        public:
          foo();
        private:
          void doSomCalulations();
        };
        
        A::foo(){
            int a=doSomCalculations();
        }
        

        作为对您的 C static 事物的评论,我不知道有什么说 static 在 C 中制造任何 private。C 没有 privatepublic 的概念。在 C 中,你只有 struct 类型,默认情况下这些都是 public

        在 C++ 中,struct 默认拥有所有成员 public。如果你想要 struct 中的 private 成员,你必须明确声明它,如下所示:

        struct my_struct
        {
        int some_public_member;
        
        private:
        int my_private_member;
        };
        

        OTOH,C 中有static,表示internal linkage。也许你是这样指代它的。

        【讨论】:

        • 如果它在struct 中呢? ;)
        • @Nim 在我的回答中添加了一些数据
        【解决方案4】:

        静态 int doSomCalculations() { ... }

        (我无法在这里查看)。

        【讨论】:

        • 请问为什么这个方案被降级了?这与其他人的回答类似,后者详细说明了一些。
        • 我没有投反对票,但也许是因为你没有详细说明?
        • 谢谢,我对stackoverflow还是很陌生,所以我以后会花更多的时间来回答。
        猜你喜欢
        • 2011-01-17
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 2011-10-20
        相关资源
        最近更新 更多