C++類轉換構造函數和轉換函數複習

//C++類轉換構造函數和轉換函數複習
#include<iostream>
#include<string>


using namespace std;


class Student
{
private:
    string name;
    int age;
    double grade;
public:
    Student(string name_, int age_, double grade_):name(name_), age(age_), grade(grade_){}
    Student(){}
    Student(double grade_) //轉換構造函數
    {
        grade = grade_;
    }
    Student(int age_)
    {
        age = age_;
    }
    explicit Student(string name_)
    {
        name = name_;
    }


    operator int() //轉換函數
    {
        return age;
    }
    explicit operator string()
    {
        return name;
    }


    string get_name()
    {
        return name;
    }
    int get_age()
    {
        return age;
    }
    double get_grade()
    {
        return grade;
    }
};


int main()
{
    //一、轉換構造函數進行類型轉換
    cout << "----------------------------" << endl;
    Student s1{"linukey", 20, 100};
    cout << s1.get_grade() << endl;
    s1 = 300.0;
    cout << s1.get_grade() << endl; //因爲類中聲明瞭單參數爲double的構造函數,所以可以直接把double類型的變量賦給s1


    //二、用explicit限制轉換構造函數的隱式轉換
    cout << "----------------------------" << endl;
    Student s2{"linukey", 20, 100};
    cout << s2.get_name() << endl;
    string temp1 = "lin";
    //s2 = temp1;  //因爲explicit限制了string類型與Student類型的隱式轉換,所以這裏會出錯


    //三、當多個相近類型同時存在時,編譯器會優先選擇最合適的,但是有時也會出現二義性
    cout << "----------------------------" << endl;
    Student s3{"linukey", 20, 100};
    cout << s3.get_grade() << endl;
    cout << s3.get_age() << endl;
    s3 = 300;
    cout << s3.get_grade() << endl; //因爲上面的300是int類型,所以編譯器優先選擇int類型的隱式轉換,所以下面的age輸出300,但是這裏的grade卻輸出亂碼
    cout << s3.get_age() << endl;


    //四、錯誤的二義性 如果有一個int類型和一個double類型的類構造函數,而我們把一個long類型的變量賦值給Student,那麼就會出錯
    cout << "-----------------------------" <<endl;
    Student s4{"linukey", 20, 100};
    long temp2 = 100;
    //s4 = temp2;  編譯器會報錯,因爲出現二義性,且沒有完全合適的long類型


    //五、轉換函數 我們前面說了單參數的類構造函數可以把其他類型賦值給類類型,但是反過來呢?這就用到了轉換函數
    cout << "-----------------------------" << endl;
    Student s5{"linukey", 20, 100};
    int temp3 = s5; //因爲聲明瞭int類型的轉換函數,所以可以把Student類型的變量轉換爲int類型
    cout << temp3 << endl;
    //注意,這裏的轉換函數依然要遵循上面的二義性的要求,不然就會出現二義性的錯誤


    //六、explicit關鍵字限制轉換函數   有的時候我們不想讓轉換函數隱式的執行,而是顯示的執行,那麼我們就需要用explicit關鍵字進行限制
    cout << "-----------------------------" << endl;
    Student s6{"linukey", 20, 100};
    //string temp4 = s6; //注意,這裏會報錯,因爲我們使用了explicit關鍵字限制了轉換函數,所以不能進行隱式的轉換
    string temp4 = (string)s6; //我麼可以通過顯示的轉換,來達到使用目的,和更高的安全性
    cout << temp4 << endl;
    
    /*
    轉換函數的要求:
    1.轉換函數必須是類方法
    2.轉換函數可以返回值,但是不能指定返回類型
    3.轉換函數不能有參數
    */




    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章