C++中的成员访问运算符和指针到成员运算符

📅 2026/7/3 9:12:06
C++中的成员访问运算符和指针到成员运算符
成员访问运算符. 和 -语法postfix-expression. namepostfix-expression – name备注成员访问运算符 . 和 - 用来引用结构、联合和类的成员。成员访问表达式具有选定成员的值和类型。有两种形式的成员访问表达式在第一种形式中postfix-expression 表示结构、类或联合类型的值name 为指定的结构、联合或类的成员命名。运算的值是 name 的值且为左值如果 postfix-expression 是左值。在第二种形式中postfix-expression 表示指向结构、联合或类的指针name 为指定的结构、联合或类的成员命名。该值是 name 的值且是左值。 – 运算符取消引用该指针。因此表达式 e–member 和 (*e).member其中e 表示指针会产生相同的结果重载运算符 – 或 * 的情况除外。以下示例演示成员访问运算符的两种形式。123456789101112131415161718192021222324// expre_Selection_Operator.cpp// compile with: /EHsc#include iostreamusingnamespacestd;structDate {Date(inti,intj,intk) : day(i), month(j), year(k){}intmonth;intday;intyear;};intmain() {Date mydate(1,1,1900);mydate.month 2;cout mydate.month / mydate.day/ mydate.year endl;Date *mydate2 newDate(1,1,2000);mydate2-month 2;cout mydate2-month / mydate2-day/ mydate2-year endl;deletemydate2;}这样的话出来的两个值分别为122/1/19002/1/2000指针到成员运算符.* 和 -*语法expression .* expressionexpression –* expression备注指向成员的指针运算符.* 和 –*返回表达式左侧上指定的对象的特定类成员的值。右侧必须指定该类的成员。下面的示例演示如何使用这些运算符1234567891011121314151617181920212223242526272829303132333435363738// expre_Expressions_with_Pointer_Member_Operators.cpp// compile with: /EHsc#include iostreamusingnamespacestd;classTestpm {public:voidm_func1() { cout m_func1\n; }intm_num;};// Define derived types pmfn and pmd.// These types are pointers to members m_func1() and// m_num, respectively.void(Testpm::*pmfn)() Testpm::m_func1;intTestpm::*pmd Testpm::m_num;intmain() {Testpm ATestpm;Testpm *pTestpm newTestpm;// Access the member function(ATestpm.*pmfn)();(pTestpm-*pmfn)();// Parentheses required since * binds// less tightly than the function call.// Access the member dataATestpm.*pmd 1;pTestpm-*pmd 2;cout ATestpm.*pmd endl pTestpm-*pmd endl;deletepTestpm;}Outputm_func1m_func1结果分别为1212在前面的示例中指向成员的指针 pmfn 用于调用成员函数 m_func1。另一个指向成员的指针 pmd 用于访问 m_num 成员。二元运算符 .* 将其第一操作数必须是类类型的对象与其第二操作数必须是指向成员的指针类型组合在一起。二元运算符 –* 将其第一操作数必须是指向类类型的对象的指针与其第二操作数必须是指向成员的指针类型组合在一起。在包含 .* 运算符的表达式中第一操作数必须是类类型且可访问而指向第二操作数中指定的成员的指针或可访问类型的成员的指针明确从该类派生并且可供该类访问。在包含 –* 运算符的表达方式中第一操作数必须是第二操作数中指定的类型的“指向类类型的指针”或明确地从该类派生的类型。考虑以下类和程序段123456789101112131415161718192021222324252627282930313233// expre_Expressions_with_Pointer_Member_Operators2.cpp// C2440 expectedclassBaseClass {public:BaseClass();// Base class constructor.voidFunc1();};// Declare a pointer to member function Func1.void(BaseClass::*pmfnFunc1)() BaseClass::Func1;classDerived :publicBaseClass {public:Derived();// Derived class constructor.voidFunc2();};// Declare a pointer to member function Func2.void(Derived::*pmfnFunc2)() Derived::Func2;intmain() {BaseClass ABase;Derived ADerived;(ABase.*pmfnFunc1)();// OK: defined for BaseClass.(ABase.*pmfnFunc2)();// Error: cannot use base class to// access pointers to members of// derived classes.(ADerived.*pmfnFunc1)();// OK: Derived is unambiguously// derived from BaseClass.(ADerived.*pmfnFunc2)();// OK: defined for Derived.}指向成员的指针运算符 .* 或 –* 的结果是在指向成员的指针的声明中指定的类型的对象或函数。因此在前面的示例中表达式 ADerived.*pmfnFunc1() 的结果是指向返回 void 的函数的指针。如果第二操作数是左值则此结果为左值。