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和中缀操作符函数查找都属于提供给函数调用的实参的属性。

相关文章推荐

C++必知必会之(9)新式转型操作符

一、C++引入了另一种转型,即采用函数形式的转型语法来表达同样的意思: typedef char *PChar; hopeItWorks = PChar( 0x00ff0000); 1、const...

C++必知必会 - 成员函数查找

调用一个成员函数,涉及三个步骤:第一步,编译器查找函数的名字;第二步,从可用候选者中选择最佳匹配函数;第三步,检查是否具有访问该匹配函数的权限。一旦在内层作用域中找到匹配的,编译器就不会到外层作用域中...
  • fishhg
  • fishhg
  • 2011年05月03日 22:28
  • 637

C++必知必会之(24)成员函数查找

1、调用一个成员函数时,包括三个步骤: 第一步,编译器查找函数的名字; 第二步,从可用候选者中选择最佳匹配函数; 第三步,检查是否具有访问该匹配函数的权限。 2、很多与函数匹配有关的错误并非源于对...

C++必知必会之(17)处理函数和数组声明

1、指向函数的指针声明与指向数组的指针声明很容易混淆, 主要原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号。 int *f1( );     //一个返回值为int *...

C++必知必会之(29)虚构造函数与Prototype模式

1、有两个主要的原因需要使用“克隆”:必须(或更喜欢)对正在处理的对象的精确类型保持“不知情”;不希望改变被克隆的原始对象,也不希望受原始对象改变的影响。 2、在C++中,提供了这种克隆对象的能力...

C++必知必会之(10)常量成员函数的含义

1、在类X的非常量成员函数中,this指针的类型为X *const。也就是说,它是指向非常量X的常量指针。由于this指向的对象不是常量,因此它可以被修改。 而在类X的常量成员函数中,this的类型为...

C++必知必会之(18)函数对象

1、与智能指针一样,函数对象也是一个普通的类对象。 智能指针类型重载->和*(可能还有->*)操作符,来模仿指针的行为; 而函数对象类型则重载函数调用操作符( ),来创建类似于函数指针的东西。 函...

C++必知必会之(16)指向成员函数的指针并非指针

1、获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。 class Shape  {     public:         //.....         void mov...

C++必知必会之(20)STL函数对象

1、STL使我们能够轻松快捷地编写复杂的代码,既标准又高度优化: std::vector names; //..... std::sort( names.begin( ),  names.end( )...

C++必知必会之(14)函数指针

1、可以声明一个指向特定类型函数的指针:void (*fp) (int);   //指向函数的指针 注意,其中的括号是必不可少的,它表明fp是一个指向返回值为void的函数的指针,而不是返回值为v...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++必知必会之(26)操作符函数查找
举报原因:
原因补充:

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