C++中点操作符和箭头操作符的使用详解_C 语言

区别

C++中对于类来说,对于其中的成员,用点操作符.来获得,

而对于一个指向类对象的指针来说,则用箭头操作符->调用该指针所指向对象的成员。

当类定义->重载操作符后,则既可以用箭头操作符,也可以用点操作符。

重载->操作符

重载箭头操作符必须定义为类成员函数。没有显式形参(而且是类成员,唯一隐式形参是this)。->的右操作数不是表达式,而是对应类成员的一个标识符,由编译器处理获取成员工作。

重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。

如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员。如果被指向的类型没有定义那个成员,则编译器产生一个错误。
如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符。编译器检查返回对象所属类型是否具有成员箭头,如果有,就应用那个操作符;否则,编译器产生一个错误。这个过程继续下去,直到返回一个指向带有指定成员的的对象的指针,或者返回某些其他值,在后一种情况下,代码出错。

代码分析:

下面给出代码,加深理解。

复制代码 代码如下:

#include <iostream>

 using namespace std;

 class A{
 public:
     void action()
     {
         cout<<"action in class A!"<<endl;
     }
 };

 class B{
         //A a;  
 public: 
     A a;
     A* operator->(){  
         return &a;  
     }  
     void action(){  
         cout << "Action in class B!" << endl;  
     }
 };

 class C{

 public:  
     B operator->(){  
         return b;  
     }  
     void action(){  
         cout << "Action in class C!" << endl;  
     }
 };

 int main()  
 {  
     C* pc = new C;  
     pc->action();  
     C c;  
     c->action();   
     return 0;  
 }

上面代码输出结果是:
Action in class C!
Action in class A!

对于代码

复制代码 代码如下:

    C* pc = new C;
    pc->action();

输出的结果是:Action in class C!
这是因为pc是类对象指针,此时的箭头操作符使用的是内置含义,对pc解引用然后调用对象的成员函数action。

对于代码:

复制代码 代码如下:

    C c;
    c->action();

可以这样理解:

c是对象,c后面的箭头操作符使用的是重载箭头操作符,即调用类C的operator->()成员函数。此时返回的是类B的对象,所以调用类B的operator->()成员函数,B的operator->()返回的是指针,所以现在可以使用内置箭头操作符了。对B的operator->()返回的指针进行解引用,然后调用解引用后的对象的成员函数action,此时调用的就是类A的action()。这里存在一个递归调用operator->()的过程,最后再使用一次内置含义的箭头操作符。

时间: 2024-10-02 06:46:25

C++中点操作符和箭头操作符的使用详解_C 语言的相关文章

下标操作符重载模拟多维数组详解_C 语言

最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧! 复制代码 代码如下:     template <typename T_CELL_STYLE>    class CMap    {    public:        CMap(IN UINT row_num, IN UINT col_num,                   IN T_CELL_STYLE cell_style = static_cast<T_CELL_STYLE>(0));         // 下

详解php比较操作符的安全问题_php实例

php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题. 在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型,为了避免意想不到的运行效果,应该使用严格比较.如下是php manual上的比较运算符表: 例子 名称 结果 $a == $b 等于 TRUE,如果类型转换后 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同. $a != $b 不等 TRUE,如

sql server的cube操作符使用详解

server|详解 cube操作符要使用cube,首先要了解group by其实cube和rollup区别不太大,只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别,cube将返回的更多的可能组合.如果在 group by 子句中有n个列或者是有n个表达式的话,sqlserver在结果集上会返回2的n-1次幂个可能组合.注意:使用cube操作符时,最多可以有10个分组表达式在cube中不能使用all关键字例子:我们在数据库统计中常常要查询以下情况:如一个定单数据库,我们要知道

PHP入门教程之操作符与控制结构流程详解_php技巧

本文实例讲述了PHP入门教程之操作符与控制结构流程.分享给大家供大家参考,具体如下: Demo1.php <?php $username = "chaoyv"; echo "His name is $username !"; $username2 = "吴者然"; echo "His name is $username2 ! "; echo "<br/>"; echo "His

《C语言解惑》一1.3 逻辑操作符和增量操作符

谜题1.3 逻辑操作符和增量操作符 请问,下面这个程序的输出是什么? define PRINT(int) printf("%d\n",int) main() { int x, y, z; x = 2; y = 1; z = 0; x = x && y || z; PRINT(x); (1.3.1) PRINT( x || ! y && z ); (1.3.2) x = y = 1; z = x ++ - 1; PRINT(x); PRINT(z); (1

asp.net 三元操作符详解

asp教程.net 三元操作符详解 三元操作符也成为条件操作符,他显得比较特别,因为有三个操作数,但是他又确实属于操作符的一种        其形式为        boolean-exp?value0 :value1        如果boolean-exp表达式结果为true,就计算value0,而且这个计算结果也就是操作符最终产生的值.如果boolean-exp表达式结果为false,就计算value1,同样的,他的结果也将成为操作符最后的值.        当然它也可以被if-else代

asp.net 字符串操作符+和+=详解

       java中+和+=操作符除了之前讲到的作用外,在特殊的上下文环境中是可以用作字符连接的.所以他们又称为字符串操作符,字符串操作符有一些很有趣的行为.如果表达式以一个字符串起头,那么后续所有的操作数都必须是字符串型(编译器会自动将双引号中的字符序列传化成字符串): public class stringoperators{        public static void main(string [] args){               int x=0,y=1,z=2;   

C# 操作符之三元操作符浅析_C#教程

C# 操作符之三元操作符"?:"是什么呢? C# 操作符之三元操作符"?:"有时也称为条件操作符. 对条件表达式b?x:y,先计算条件b,然后进行判断. 如果b的值为true,计算x的值,运算结果为x的值:否则,计算y,运算结果为y的值. 一个条件表达式从不会又计算x,也计算y.条件操作符是向右关联的,也就是说,从左向右分组计算. C# 操作符之三元操作符"?:"操作实例: 表达式a?b:c?d:e将按a?b:(C?d:e)形式执行. ?:的第二

PostgreSQL教程(七):函数和操作符详解(3)_PostgreSQL

九.序列操作函数:     序列对象(也叫序列生成器)都是用CREATE SEQUENCE创建的特殊的单行表.一个序列对象通常用于为行或者表生成唯一的标识符.下面序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的方法.   函数 返回类型 描述 nextval(regclass) bigint 递增序列对象到它的下一个数值并且返回该值.这个动作是自动完成的.即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值. currval(regclass) big