关于类型转换构造函数的疑惑点

#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类型的临时变量。再将这个这个变量赋值到左边。因此这条语句能够通过编译。

posted @ 2019-12-12 21:21  江南又一春  阅读(106)  评论(0编辑  收藏  举报