种豆资源网

当前位置:首页 > 百科 > 百科综合 / 正文

结构解引用运算符

(2019-06-05 02:42:01) 百科综合
结构解引用运算符

结构解引用运算符

结构解引用运算符(Structure dereference operator),也称通过指针访问成员运算符(Element selection through pointer),是 C语言与C++的运算符。其功能是获取运算符左侧的指针所指向的对象的某个成员。该运算符的优先权较高,与函式调用运算符、数组下标运算符、通过引用选择成员运算符相同,也是自左向右结合。

基本介绍

  • 中文名:结构解引用运算符
  • 外文名:Structure dereference operator
  • 学科:计算机语言
  • 功能:指向左侧对象的某个成员
  • 别名:通过指针访问成员运算符
  • 有关术语:运算符

定义

结构解引用运算符是一个双目运算符,获取->所指单元的内容。当某个类中对->操作符重载时,是将该类对象当做一个指针看待,而用->操作符提取指针所指向的内容。结构解引用运算符必须是类的成员函式。结构解引用运算符的返回值必须是一个指针,或者是一个重载了结构解引用运算符的对象。如果返回的是一个指针将调用内置的结构解引用运算符、如果返回是一个重载了如果返回是一个重载了箭头运算符的对象,则继续对该对象调用其重载了的箭头运算符,直到返回的是一个指针的对象,则继续对该对象调用其重载了的结构解引用运算符,直到返回的是一个指针。该运算符可以视作为解引用运算符*的语法糖。即p->a相当于(*p).a。C++对该运算符的使用规定为:
运算符左端如果是个指针类型,则直接对该指针类型解引用访问所指向对象的成员。即该运算符重载在此情形下未被使用。
运算符左端如果不是指针类型,编译器则调用该运算符的重载版本。如果没有重载版本则编译报错。该运算符的重载版本的返回值,或者是指针类型,或者是内含重载定义了->运算符的类型;对这两种情形编译器分别做指针解引用与递归调用返回类型的重载版本的->运算符。

运算符重载

运算符用于执行程式代码运算,会针对一个以上运算元项目来进行运算。运算符重载是赋予运算符多重含义。通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。运算符重载是针对新类型数据的实际需要,对原有运算符进行适当改造。一般来讲,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少有一个操作对象是自定义的类型。运算符重载是函式重载的一种特殊套用。
所谓函式重载简单地说就是赋给同一个函式名多个含义。具体地讲,C+ +中允许在相同的作用域内以相同的名字定义几个不同实现的函式,可以是成员函式,也可以是非成员函式。但是,定义这种重载函式时要求函式的参数或者至少有一个类型不同或者个数不同。C+ +把运算符视为特殊的函式,因此运算符重载就是函式重载的一种特殊情况。像对待一般重载函式一样,编译系统能够依据调用运算符的不同环境,即参数(运算元)的数量或类型的差异,区分同一运算符的不同含义。除了new和delete这2个较为特殊运算符以外,任何运算符如果作为成员函式重载必须是非静态成员函式,其第一运算元就是该对象本身,因此不出在参数表中出现(或者说第一运算元是通过隐含的this指针传递的):如果作为非成员函式重载,所有的运算元都应作为参数在参数表中出现,因此参数表中至少有一个参数。大部分运算符既可以作为成员函式重载,又可以作为非成员函式重载,但= ,[],(),和->这4个运算符只能作为成员函式进行重载,而且不能是针对枚举型运算元的重载。

优先权别和结合性

C语言将这34种运算符规定了不同的优先权别和结合性。优先权是用来标识运算符在表达式中的运算顺序的,在求解表达式的值的时候,总是先按运算符的优先次序由高到低进行操作,可是,当一个运算对象两侧的运算符优先权别相同时,则按运算符的结合性来确定表达式的运算顺序。
运算符的结合性指同一优先权的运算符在表达式中操作的组织方向,即:当一个运算对象两侧运算符的优先权别相同时,运算对象与运算符的结合顺序,C语言规定了各种运算符的结合方向( 结合性) 。大多数运算符结合方向是“自左至右”,即:先左后右,例a- b+c,b两侧有- 和+两种运算符的优先权相同,按先左后右结合方向,b先与减号结合,执行a- b的运算,再执行加 c 的运算。除了自左至右的结合性外,C语言有三类运算符参与运算的结合方向是从右至左。即:单目运算符,条件运算符,以及赋值运算符。关于结合性的概念在其他高级语言中是没有的,这是 C语言的特点之一, 特别是从右至左结合性容易出错。
在数学和计算机科学中,运算次序(也称为运算顺序、运运算元优先权)是指决定在表示式中的哪一运运算元首先被执行的规则。比如,在四则运算中,一般有先乘除后加减的规定。就是说在2 + 3×4这样的式子中,按规定会先对3和4作乘法,得出12,然后再把2和12加起来,最后就得出14。

代码示例

#include <iostream>  class foo{public:    void func(){        std::cout<<"foo say hello "<<std::endl;    }};class bar{    foo a;public:    foo* operator->(){        return &a;    }    void func(){        std::cout<<"bar said hello"<<std::endl;    }};class D{    bar b;public:    bar operator->(){        return b;    }    void func(){        std::cout<<"D said hello"<<std::endl;    }};int main(){    D dumb, *pd=&dumb;    pd->func(); //pc为一个类的指针 所以直接解引用    D d;    d->func(); //d不是一个指针类型,所以调用了D::operator->()重载版本}

标 签

搜索
随机推荐

Powered By 种豆资源网||