我已经开始使用 C++ 中的类,并且发现了两种不同的字段声明:
type ClassName::*var;
和
type *ClassName::var;
它们之间有什么区别?
编辑:还有一个问题可以像这样声明方法:
type *ClassName::method_one(...);
type ClassName::*method_two(...);
有什么不同?
它们是不同的。第一个声明一个指向类型成员变量的指针type
。
第二个是类型的类成员的静态定义。var
ClassName
type*
第三个(即使不完整)是返回的成员函数的定义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()
}
一个是指向成员的指针,另一个是作为指针的成员。
如果您将声明用于静态初始化之类的东西:
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
同样,声明在语义上有所不同。只有第一个函数正确定义了返回指针的成员函数。