详解C++中的成员访问运算符和指针到成员运算符
成员访问运算符:. 和 ->
语法
postfix-expression
. name
postfix-expression –> name
备注
成员访问运算符 . 和 -> 用来引用结构、联合和类的成员。成员访问表达式具有选定成员的值和类型。
有两种形式的成员访问表达式:
在第一种形式中,postfix-expression 表示结构、类或联合类型的值,name 为指定的结构、联合或类的成员命名。运算的值是 name 的值且为左值(如果 postfix-expression 是左值)。
在第二种形式中,postfix-expression 表示指向结构、联合或类的指针,name 为指定的结构、联合或类的成员命名。该值是 name 的值且是左值。 –> 运算符取消引用该指针。因此,表达式 e–>member 和 (*e).member(其中,e 表示指针)会产生相同的结果(重载运算符 –> 或 * 的情况除外)。
以下示例演示成员访问运算符的两种形式。
// expre_Selection_Operator.cpp // compile with: /EHsc #include <iostream> using namespace std; struct Date { Date(int i, int j, int k) : day(i), month(j), year(k){} int month; int day; int year; }; int main() { Date mydate(1,1,1900); mydate.month = 2; cout << mydate.month << "/" << mydate.day << "/" << mydate.year << endl; Date *mydate2 = new Date(1,1,2000); mydate2->month = 2; cout << mydate2->month << "/" << mydate2->day << "/" << mydate2->year << endl; delete mydate2; }
这样的话出来的两个值分别为:
2/1/1900 2/1/2000
指针到成员运算符:.* 和 ->*
语法
expression .* expression
expression –>* expression
备注
指向成员的指针运算符(.* 和 –>*)返回表达式左侧上指定的对象的特定类成员的值。右侧必须指定该类的成员。下面的示例演示如何使用这些运算符:
// expre_Expressions_with_Pointer_Member_Operators.cpp // compile with: /EHsc #include <iostream> using namespace std; class Testpm { public: void m_func1() { cout << "m_func1\n"; } int m_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; int Testpm::*pmd = &Testpm::m_num; int main() { Testpm ATestpm; Testpm *pTestpm = new Testpm; // Access the member function (ATestpm.*pmfn)(); (pTestpm->*pmfn)(); // Parentheses required since * binds // less tightly than the function call. // Access the member data ATestpm.*pmd = 1; pTestpm->*pmd = 2; cout << ATestpm.*pmd << endl << pTestpm->*pmd << endl; delete pTestpm; } Output m_func1 m_func1
结果分别为:
1 2
在前面的示例中,指向成员的指针 pmfn 用于调用成员函数 m_func1。另一个指向成员的指针 pmd 用于访问 m_num 成员。
二元运算符 .* 将其第一操作数(必须是类类型的对象)与其第二操作数(必须是指向成员的指针类型)组合在一起。
二元运算符 –>* 将其第一操作数(必须是指向类类型的对象的指针)与其第二操作数(必须是指向成员的指针类型)组合在一起。
在包含 .* 运算符的表达式中,第一操作数必须是类类型且可访问,而指向第二操作数中指定的成员的指针或可访问类型的成员的指针明确从该类派生并且可供该类访问。
在包含 –>* 运算符的表达方式中,第一操作数必须是第二操作数中指定的类型的“指向类类型的指针”或明确地从该类派生的类型。
考虑以下类和程序段:
// expre_Expressions_with_Pointer_Member_Operators2.cpp // C2440 expected class BaseClass { public: BaseClass(); // Base class constructor. void Func1(); }; // Declare a pointer to member function Func1. void (BaseClass::*pmfnFunc1)() = &BaseClass::Func1; class Derived : public BaseClass { public: Derived(); // Derived class constructor. void Func2(); }; // Declare a pointer to member function Func2. void (Derived::*pmfnFunc2)() = &Derived::Func2; int main() { 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 的函数的指针。如果第二操作数是左值,则此结果为左值。
System_CAPS_note注意
如果某个指向成员的指针运算符的结果是函数,则该结果只能用作函数调用运算符的操作数。
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10求子数组最大和的解决方法详解
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10HDOJ 1443 约瑟夫环的最新应用分析详解
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10如何查看进程实际的内存占用情况详解
- 01-10深入Main函数中的参数argc,argv的使用详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文