imjacob的专栏

首页博文目录订阅
正 文

赋值操作符,下标操作符,函数调用操作符,指针成员访问箭头必须重载为类成员函数的原因?

(2008/12/20 15:17)

操作符重载里有这样一条规则:赋值操作符(=),下标操作符([]),函数调用操作符(()),指针成员访问箭头(->)必须重载为类成员函数
我写了几个函数测试了一下,当把这些操作符重载成友元全局函数时,编译器就会报错了,输出"xx operator must be a member function"。

 #include <iostream>
using namespace std;
//赋值操作符(=),下标操作符([]),函数调用操作符(()),指针成员访问箭头(->)必须重载为类成员函数

//Method为测试->操作符而引入。
class Method {

public:
 void set(int i){cout<<"action"<<i<<endl;}
};


template <typename T>
class AA {

public:
 AA(AA *r){width = r->width;cout<<"copy1"<<endl;}
 AA(AA &t){width = t.width;cout<<"copy2"<<endl;}
 AA(){};
 AA(T i){width = i;};
 AA(AA bb,T i){};

 

 //1.赋值操作符
 //friend AA & operator=( AA &a, AA &b ) ;

 AA & operator=(const AA &a){
  cout<<"fuzhi operator"<<endl;
  if(this == &a)
   return *this;
  this->width = a.width;
  return *this;
 }

 //2.下标操作符
 //friend void operator()(int a);

 void operator()(int a){cout<<"call"<<a<<endl;}

 //3.函数调用操作符
 //friend int& operator[](int x);
 T& operator[](int x){cout<<"index"<<x<<endl;return width;}


 //4.指针成员访问箭头
 //friend T * operator->();
 T * operator->(){cout<<"jiantou"<<endl;return ptr;}
private:
 T width;
 T *ptr;
};

/*
赋值操作符(=),下标操作符([]),函数调用操作符(()),指针成员访问箭头(->)作为全局友元函数时,都error。

void operator()(int a){cout<<"call"<<a<<endl;}

AA & operator=( AA &a, AA &b ) {
 cout<<"fuzhi operator"<<endl;
  if(&a == &b)
   return a;
  a.width = b.width;
  return a;
}

 


int& operator[](int x){cout<<"shuzu"<<x<<endl;return width;}

template <typename T>
T * operator->(){cout<<"jiantou"<<endl;return ptr;}

*/

template <typename T>
void printSPR(AA<T> &s){


}

 


   

int main()
{
 
 
 AA<int> a(2);
 AA<int> b;
 AA<int> c;
 //赋值操作符
 a =b=c;

 //调用操作符
 a(3);

 //下标操作符
 a[3]= 9;

 //->操作符
 Method m1;
 AA<Method> method(m1);
 method->set(5);

 //a->();

 //AA b;
 //AA c;
 //a=b=c;


 //AA *p = &a;
 //AA bb(p);
 //AA cc(a);

 //printSPR(AA());

}   

那原因是什么呢?

1.赋值操作符 ,可能是因为拷贝赋值操作符的存在,编译器要决定是不是要自动生成一个 还是 使用用户提供的,如果赋值操作符是非成员的,就不容易判断。(参考http://blog.csdn.net/sandyqy/archive/2007/10/07/1813649.aspx

2.
评 论
1楼 52RD网友 发表于 2011/3/26 21:23 回复
顶啊顶啊
博 主
进入imjacob的首页
博客名称:雅克的一府
日志总数:513
评论数量:853
访问次数:1880687
建立时间:2006/11/23 20:52
导 航
公 告
Locations of visitors to this page 本博客主要用于个人学习与资料收藏。当然大家应该读了之后也能学到不少东西。其中大多数资料都是来自网络,我转载时尽可能地表明文章出处与原作者姓名,但由于很多资料经多人转载,已不清楚原作者信息与出处,所以未表明相关…
评 论
链 接

ARM+LINUX 嵌入式博客
http://blog.chinaunix.net/u1/58780/index.html

嵌入式软件
http://blog.csdn.net/embeddedsoft

诚诚恳恳做人踏踏实实编程
http://blog.sina.com.cn/u/1244756857 

和我风格相似的一个blog
http://blogger.org.cn/blog/m…