等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)
- 先看下面程序结果输出什么?
-
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 private: 7 int x; 8 public: 9 A(){ 10 x=99; 11 cout<<"看看这里是否会被调用"<<endl; 12 } 13 }; 14 15 int main() 16 { 17 A a; 18 a = 7; 19 }
这里面,会报错,显示没有等号匹配现象。只有无参构造函数,函数类型的对象赋值会报错
-
- 接下来是有无参构造函数和有参构造函数的类
-
#include <iostream> using namespace std; class A { private: int x; public: A(){ x=99; cout<<"看看这里是否会被调用"<<endl; } A(int xx) { cout<<"Call A(int xx)"<<endl; x = xx; } }; int main() { A a; a = 7; }
运行结果为:
-
-
这里可以理解为当类中没有定义等号赋值运算符重载的时候,类对象的赋值会调用相对应的参数构造函数
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 private: 7 int x; 8 public: 9 A(){ 10 x=99; 11 cout<<"看看这里是否会被调用"<<endl; 12 } 13 A(int xx) 14 { 15 cout<<"Call A(int xx)"<<endl; 16 x = xx; 17 } 18 19 A operator=(int xx) //重载赋值运算符运算 20 { 21 cout<<"Call A operator=(int xx)"<<endl; 22 x = xx; 23 return *this; 24 } 25 26 }; 27 28 int main() 29 { 30 A a; 31 a = 7; 32 }
运行结果:
这里类中有等号操作符重载,所以会直接调用这个。
如果用友元函数重载等号操作符的时候,程序会调用参数构造函数的,这样会出错
A a;
A b;
a = b ; //这里会直接等号操作符,按照上面的道理,这里调用的是无参构造函数呢