//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;
}
C++類轉換構造函數和轉換函數複習
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
C++智能指針模板類複習
//C++智能指針模板類複習 #include<iostream> #include<memory> using namespace std; //
linukey
2020-06-23 06:00:02
模板元編程加速遞歸
//模板元編程加速遞歸 //缺點:模板元在編譯時處理,無法調試,並且會加大代碼體積 #include<iostream> using namespa
linukey
2020-06-23 06:00:02
C++ lambda表達式複習
linukey
2020-02-23 19:47:32
C++中類const、static、static const成員變量
linukey
2020-02-23 19:47:32
C++實現C語言printf函數
linukey
2020-02-23 19:47:32
C++ 在堆上開闢與釋放二維、三維指針
linukey
2020-02-23 19:47:32
利用包裝器以及lambda表達式實現二叉查找樹
linukey
2020-02-23 19:47:32
extern
yuwei19840916
2020-02-23 15:07:22
linux下查看so文件的函數列表
赵小刚
2020-02-22 22:52:11