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