2011-03-03 35 views

回答

2

在C++中,静态成员函数就像普通的全局函数一样,除了关于名称的可见性外:

  1. 函数的名称使用类名进行限定。
  2. 与朋友函数一样,静态成员函数可以访问私有和受保护的类成员。然而,与朋友函数一样,它没有this指针,因此它只能访问您授予它访问权的对象的那些部分(例如,作为参数传递)。
  3. (谢谢Alf):你不能声明任何成员函数(静态或其他)extern "C"
+0

我想补充说你不能声明它是'external“C”'。这对C回调来说是一个痛苦,尽管它很容易解决(或者只是在编译器允许的情况下忽略形式)。 – 2011-03-03 19:14:18

+0

@Alf P. Steinbach:完成。谢谢 - 我忘记了。 – 2011-03-03 19:17:09

0

使一个静态函数可以在不实例化它所属类的实例的情况下调用它。 learncpp.com有更多一些关于这个问题,并检查了下面的例子,这将无法被编译:

class Foo 
{ 
public: 
    static void Bar1(); 
    void Bar2(); 
}; 

int main(int argc, char* argv[]) 
{ 
    Foo::Bar1(); 

    Foo x; 
    x.Bar2(); 

    Foo::Bar2(); // <-- error C2352: 'Foo::Bar2' : illegal call of non-static member function 

    return 0; 
} 
+1

-1请修正'void main'。在说明错误的例子中引入不相关的错误是不恰当的。有助于downvote,被引用的“你必须在静态方法内声明该类的一个实例”就是很粗鲁,尽管它可以被知道该语言的人解码。 – 2011-03-03 19:11:26

+0

公平点;完成。 – 2011-03-04 00:46:53

-2

静态函数可以被调用,而不实际创建该类型的变量,例如:

class Foo 
{ 
public: 
    static void Bar(); 
    void SNAFU(); 

}; 

int main(void) 
{ 
    Foo::Bar(); /* Not necessary to create an instance of Foo in order to use Bar. */ 
    Foo x; 
    x.SNAFU(); /* Necessary to create an instance of Foo in order to use SNAFU. */ 
} 
+0

-1:类声明末尾需要分号 – 2011-03-03 18:55:58

+0

-1:'main'函数返回'int'。总是。 – 2011-03-03 20:47:19

+0

@Thomas和Jon,我修复了你提到的错误。 – 2011-03-04 15:34:45

0

静态成员函数(在类中)意味着您可以调用该函数而不必先创建类的实例。这也意味着该函数不能访问任何非静态数据成员(因为没有实例来获取数据)。 例如

class TestClass 
{ 
public: 
    TestClass() {memberX_ = 10;} 
    ~TestClass(); 

    // This function can use staticX_ but not memberX_ 
    static void staticFunction(); 

    // This function can use both staticX_ and memberX_ 
    void memberFunction(); 

private: 
    int memberX_; 
    static int staticX_; 
};