问题描述:
为何C++中赋值操作符只能重载为成员函数?不能为普通函数或者友元函数!
问题解决:
1、不能重载为普通函数,是因为赋值操作会访问类的私有成员,而普通函数无法访问类的私有成员
2、不能为友元函数,是因为友元函数没有this指针,友元函数的参数至少为两个,假定在类中声明如下的友元函数:
friend assignment& operator=(assignment& a,const assignment& b) { a.v=b.v; return a; }
那么可能会存在2=b;其中b为assignment对象,常数2 可以通过隐式类类型转换为assignment临时对象,然后调用上述友元函数,但是
赋值操作要求左值为变量,2为一个常量,这样就会出现赋值操作的二义性,因而赋值操作只能重载为成员函数。
考虑如下类:
/** * 赋值操作符一般做为成员函数重载不能作为普通函数或者友元函数重载,为什么? * */ #include <iostream> using namespace std; class assignment { public: assignment() { cout<<"default"<<endl; v=0; } assignment(int v) { cout<<"param"<<endl; this->v=v; } assignment(const assignment& copy) { cout<<"copy"<<endl; this->v=copy.v; } assignment& operator=(const assignment& assign) { cout<<"assignment"<<endl; if (this==&assign) return *this; this->v=assign.v; return *this; } friend int fmethod(int a,const assignment& b); //友元函数声明 private: int v; }; int fmethod(int a,const assignment& b) { return a+b.v; } int main() { //测试拷贝构造函数 cout<<"=========测试拷贝构造函数========="<<endl; assignment default; assignment copy=default; cout<<endl; //测试赋值操作符重载 cout<<"=========测试赋值操作符重载========="<<endl; copy=default; cout<<endl; //隐式类类型转换 cout<<"=========隐式类类型转换=========="<<endl; copy=12; //隐式类类型转换,调用assignment的含参数构造函数,将12转换为assignment临时对象 cout<<"=========友元函数=========="<<endl; cout<<fmethod(3,copy)<<endl; }
注:
如上代码中,assignment default; assignment copy=default; 调用拷贝构造函数
copy=default; 调用赋值操作