C++(20)--类型自动转换
類型自動轉換
- 1.C++內置類型轉換
- 2.實現自定義類的類型轉換
《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------
1.C++內置類型轉換
// 自動類型轉換(隱式類型轉換) int num = 111; num = 222.2 + num; // 顯示類型轉換 int num = int(99.9); // C 語言中的顯式類型轉換 int num = (int)99.5;注意點:不管是自動轉換,還是強制轉換,實質是內置類型已經重載了對應的運算符。一些默認的轉換規則為:
1.浮點->整形:舍棄小數部分
2.整形->浮點:數值不變,存儲形式變了,以指數形式存儲
3.double->float:注意數值
4.字符類型可以賦值給整形變量,此時存入的是字符的ASCLL碼
5.將int、long、short傳遞給char型變量,只將低8位原封不動的送到char型變量中
6.有符號->無符號,連同原來的符號位一起傳送
C++允許自己定義類型轉換規則,通過類的成員函數的形式來實現
將其他類型轉 換為 當前類型需要借助 轉換構造函數
demo: 說明為了獲得目標類型,編譯器會不擇手段,綜合使用內置轉換規則和用戶自定義的規則, 進行多級類型轉換。
// 自定義rectangle類,假設具有三種構造函數 Rectangle(); Rectangle(float width); Rectangle(float width, float height);Rectangle rect(25.5, 18.8); Rectangle rect2; rect2 = rect1 + 98; // 編譯器會根據內置類型規則先將int 類型98轉換為double類型的98.0 // 再根據用戶自定義規則將double類型的98.5轉換成Rectangle類型再談構造函數:構造函數是在創造對象的時候初始化對象,編譯器會依據傳遞參數不同來匹配不同的構造函數
2.實現自定義類的類型轉換
1.基本類型->當前類型–轉換構造函數實現
2.當前類型->基本類型–類型轉換函數實現
類型轉換函數:將當前的類型轉換成其他類型。只能以成員函數的形式出現,也就是只能出現在類中
形式上沒有返回值,其實是隱式指明了返回值的類型。
沒有參數,因為需要將當前類對象轉換成其他類型。
demo1:矩形、圓形類型轉換
//mian.cpp #include <iostream> #include "Rectangle.h" using namespace std; void TestRectangle() {Rectangle rect1; // 調用默認構造Rectangle rect2(25.0, 50.5); // 調用代參構造Rectangle rect3(rect1); // 調用拷貝構造// 能夠與基本類型進行互相轉換呢Rectangle rect4 = 55; // 想變成正方型,調用一個參數的構造--轉換構造Rectangle rect5(55);rect4.display(); // Rectangle rect6; // 需要重載加號運算符吧 // rect6 = rect5 + "A" + false;float rect4_width = float(rect4);cout << rect4_width << endl;Circle circle1 = rect4; // 矩形和圓形之間可以相互轉換cout << "圓的信息:" << circle1 << endl;} int main() {TestRectangle();return 0; } //Rectangle.h // // Created by 陳瑩瑩 on 2021/3/10. // #ifndef CHAPTER12_RECTANGLE_H #define CHAPTER12_RECTANGLE_H #include <iostream> #include "Circle.h" using namespace std; // 自定義矩形類class Rectangle { public:Rectangle(); // 無參構造,可以由編譯器自動生成Rectangle(float width, float height); // 代參構造, 用戶定義的普通代參構造Rectangle(const Rectangle & rect); // 拷貝構造,在以拷貝方式初始化對象時調用Rectangle(float width); // 轉換構造--將其他類型轉換為當前類型時使用// 將幾個構造函數融合在一起寫(拷貝構造還是需要單獨寫)---感覺這么寫可以,但是和轉化個構造單獨實現還是不一樣吧 // Rectangle(float width = 0, float height = 0): width(width),height(height) // { // // }// 矩形轉換成floatoperator float() const{return width;}// 矩形轉換成Circle類型operator Circle() const{return Circle(width/2);}void display(){cout << "width:" << width << endl;cout << "height:" << height << endl;}~Rectangle(); // private:int width;int height; }; #endif //CHAPTER12_RECTANGLE_H //Rectangle.cpp // // Created by 陳瑩瑩 on 2021/3/10. //#include "Rectangle.h"Rectangle::Rectangle():width(0),height(0) { }Rectangle::Rectangle(float width, float height):width(width), height(height) {} Rectangle::Rectangle(const Rectangle & rect) { } Rectangle::Rectangle(float width):width(width),height(width) {// 構建了一個矩形 }Rectangle::~Rectangle() { } //Circle.h // // Created by 陳瑩瑩 on 2021/3/10. //#ifndef CHAPTER12_CIRCLE_H #define CHAPTER12_CIRCLE_H #include <iostream> using namespace std; class Circle { public://Circle();Circle(float radius = 0):radius(radius){}friend ostream & operator<<(ostream & out, const Circle & circle);~Circle(); private:float radius;float area; }; #endif //CHAPTER12_CIRCLE_H //Circle.cpp // // Created by 陳瑩瑩 on 2021/3/10. // #include "Circle.h" ostream & operator<<(ostream & out, const Circle & circle) {out << circle.radius;out << endl; } Circle::~Circle() { }總結
以上是生活随笔為你收集整理的C++(20)--类型自动转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++:03---引用类型
- 下一篇: C++:39---继承中构造函数、析构函