#include <iostream>
using namespace std;
// 一个类,有一个成员val
class A {
public:
int val;
A(int x=123): val(x){} //解答关键点
A& GetObj(){
return *this;
}
/*
函数一:
A& operator=(int x){
val = x;
}
函数二:
A& operator=(const A y){
val = y.val;
}
*/
};
int main()
{
int m,n;
A a;
cout << a.val << endl;
while(cin >> m >> n) {
a.GetObj() = m; //疑惑点:为什么可以将一个int型的数赋值给一个类类型的引用?
cout << a.val << endl;
a.GetObj() = A(n);
cout << a.val<< endl;
}
return 0;
}
这道题目的疑惑点如上述:为什么可以将一个int型的数赋值给一个类类型的引用?
问题的关键就在于我所写的构造函数:
A(int x=123): val(x){} //解答关键点
这个构造函数非常的特殊,因为它可以起3个作用:
- 作为无参构造函数使用。
- 作为普通的接受一个int型变量的构造函数使用。
- 正是由于它只接收了一个参数,因此可以当做:转换构造函数使用。
这个构造函数的第三个作用便是这道题目的答案所在:
当编译器执行到:
a.GetObj() = m;
这条语句时,发现左边为A类型的引用,而右边为一个int型的变量,此时它便会去找能否将一个int型变量转换为A类型对象的转换构造函数。而:
A(int x=123): val(x){}
这个函数可以做到这一点。于是,编译器首先将等号右边的int型变量转换为A类型的临时变量。再将这个这个变量赋值到左边。因此这条语句能够通过编译。