zoukankan      html  css  js  c++  java
  • 关于类型转换构造函数的疑惑点

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

  • 相关阅读:
    MapReduce实例
    hadoop 分布式安装
    redis缓存
    Flink初始
    Flume初始
    大数据学习之路(持续更新中...)
    使用VisualVM分析性能
    JVM的理解
    Java日记
    UI笔记2
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764227.html
Copyright © 2011-2022 走看看