C++必知必会之(26)操作符函数查找

原创 2013年12月05日 13:52:29

1、有时看上去好像一个成员操作符函数重载了一个非成员的操作符,其实并非如此。

这不是重载,只是不同的查找算法。

考虑如下类,它以成员函数的形式重载了一个操作符函数:

class X {

    public:

       X  operator %( const X & ) const;        //二元取余操作符

       X  memFunc1( const X & );

       void memFunc2( );

       //....

};

可以采用中缀或函数调用语法来调用这个重载的操作符函数:

X a, b, c;

a = b % c;     //采用中缀语法调用成员操作符%

a = b.operator % ( c) ;       //成员函数调用语法

a = b.memFunc1( c);             //另一个成员函数调用


当我们使用函数调用语法时,应用的是普通的查找规则,也就是说,对b.operator %(c)调用的处理方式与memFunc1的相同。

然而,对重载操作符的中缀调用的处理机制则与此不同:

X operator %( const X &, int );      //非成员操作符

//.....

void X::memFunc2( )   {

       *this % 12;   //调用非成员操作符%

       operaotr %( *this, 12 );         //错误,实参太多

}

对于中缀操作符调用来说,编译器不仅会考虑成员操作符,也会考虑非成员操作符,

因此第一个对operator%的中缀调用,将会匹配非成员的那一个。

不是一个重载的例子,而是编译器在两个不同的地方查找候选函数。

第二个对operator%的非中缀调用遵循标准的函数查找规则,因而匹配那个成员函数。

这里我们遇到一个错误,因为我们试图将三个实参传递给一个二元函数(记住,对成员函数的调用存在一个隐式的实参this)。


实际上,对重载操作符的中缀调用执行了一个退化形式的ADL,即当确定将哪些函数纳入重载解析考虑范围时,中缀操作符中左参数的类(可能只有一个左参数,而没有右参数)的作用域和全局作用域都被考虑在内。

ADL则将这个过程扩展到被操作符实参所带入的其他名字空间中候选操作符函数。

注意这并不是重载。

重载是一个和函数声明有关的静态属性,而ADL和中缀操作符函数查找都属于提供给函数调用的实参的属性。

《SQL必知必会》(1-7)

《SQL必知必会》读书笔记 说明:本书SQL语句均使用PLSQL Developer客户端,在oracle数据库中实践。 1. 基本概念 表(table):某种特定类型数据的结构化清单。 模式...
  • Regina_niu
  • Regina_niu
  • 2016年12月21日 09:33
  • 542

C++必知必会(1)

条款1数据抽象 抽象数据类型的用途在于将变成语言扩展到一个特定的问题领域。一般对抽象数据类型的定义需要准训以下步骤: 1.     为类型取一个描述性的名字 2.     列出类型所能执行的操作...
  • walkerkalr
  • walkerkalr
  • 2014年05月23日 19:38
  • 972

2017最新hadoop前置课程大数据开发之Linux必知必会(centos6.4)

目录 第1章 Linux 基本环境 1.1、 大数据Hadoop前置课程大纲讲解.mp4 1.2、 常见Linux系统,安装VMWare及虚拟机.mp4 1.3、 导入已安装好虚拟机及如何设置...
  • yiqizixueba
  • yiqizixueba
  • 2017年11月09日 23:17
  • 45

《SQL必知必会》学习笔记(一):实验数据初始化

摘要:本文主要提供《SQL必知必会》一书中实验所用的数据库,以及创建数据库、表、约束和初始化的SQL语句。...
  • zwxtfqd
  • zwxtfqd
  • 2015年11月18日 16:00
  • 2241

《MySQL必知必会》全书总结

知识点回顾
  • sinat_28978689
  • sinat_28978689
  • 2017年02月21日 21:08
  • 1864

SQL必知必会 第4版pdf

下载地址:网盘下载 内容简介  · · · · · · SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能。 本书是深受世界...
  • cf406061841
  • cf406061841
  • 2017年06月03日 23:18
  • 5102

正则表达式必知必会(修订版)整理教程

正则表达式必知必会(修订版)整理教程 1.   正则表达式入门 1.1  用途:是一种工具,主要用途是搜索变化多端的文本。匹配       到我们想要的信息。 1.2  使用正则表达式:在线测试工具:...
  • T1DMzks
  • T1DMzks
  • 2016年07月03日 01:33
  • 10580

C++ 必知必会

C++常用的东西,必知必会,长期更新。
  • CSND_Ayo
  • CSND_Ayo
  • 2017年04月13日 20:51
  • 348

mysql学习--mysql必知必会

数据库操作分类:
  • huang2009303513
  • huang2009303513
  • 2014年05月18日 09:12
  • 2769

sql必知必会(第四版) 学习笔记一

温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记.... 1 去重复关键词,distinct     select distinct sname from student;   2...
  • Dreamworker007
  • Dreamworker007
  • 2013年10月26日 23:02
  • 8175
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++必知必会之(26)操作符函数查找
举报原因:
原因补充:

(最多只允许输入30个字)