2

我已经开始使用 C++ 中的类,并且发现了两种不同的字段声明:

type ClassName::*var;

type *ClassName::var;

它们之间有什么区别?

编辑:还有一个问题可以像这样声明方法:

type *ClassName::method_one(...);
type ClassName::*method_two(...);

有什么不同?

4

2 回答 2

1

它们是不同的。第一个声明一个指向类型成员变量的指针type

第二个是类型的类成员的静态定义。varClassNametype*

第三个(即使不完整)是返回的成员函数的定义type*

第四个是一个指向返回的成员函数type的指针的声明。


class A {
public :
   int i;
   static int *j;
   int* f();
   int g() { std::cout << "g" << std::endl; }
};

int* A::j;                // First one
int* A::f() { }           // Third one

int main() {
    A a;

    int A::*i_ptr;        // Second one
    i_ptr = &A::i;    
    a.*i_ptr = 2;         // Modifying a.i

    int (A::*mem_fn) ();  // Fourth one
    mem_fn = &A::g;
    (a.*mem_fn)();        // calling a.g()
}
于 2013-04-20T11:32:34.120 回答
0

一个是指向成员的指针,另一个是作为指针的成员

如果您将声明用于静态初始化之类的东西:

class SomeClass {
public:
    static int *member, *othermember;
};

int SomeClass::*member = 0;
int *SomeClass::othermember = 0;

虽然这编译得很好,但如果你真的使用 member你会得到一个链接器错误(而不是othermember,因为你定义了一个指向成员的指针;而不是一个成员即指针。

使用您的函数定义:

class SomeOtherClass {
public:
    static int *function();
};

int *SomeOtherClass::function() { return 0; } // This will work
int SomeOtherClass::*function() { return 0; } // This won't work

同样,声明在语义上有所不同。只有第一个函数正确定义了返回指针的成员函数。

于 2013-04-20T11:33:14.687 回答