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


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

  • 相关阅读:
    实测好用的awvs批量添加任务脚本
    SQL注入漏洞
    CTF-WEB-信息泄露题目总结
    Awvs+nessus docker版本
    禅道12.4.2后台管理员权限Getshell复现
    子域名工具,使用必应搜索引擎
    i春秋第二届春秋欢乐赛-Web-Hello World
    百度杯CTF比赛 九月场-WEB-题目名称:SQL
    文件上传漏洞
    CVE-2019-17625漏洞复现(Rambox 0.6.9版本存储型XSS)
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764227.html
Copyright © 2020-2023  润新知