類型自動轉換
- 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.當前類型->基本類型–類型轉換函數實現
類型轉換函數:將當前的類型轉換成其他類型。只能以成員函數的形式出現,也就是只能出現在類中
形式上沒有返回值,其實是隱式指明了返回值的類型。
沒有參數,因為需要將當前類對象轉換成其他類型。
operator type(){return data;
}
// 實際上編譯器會把當前對象的地址賦給this 指針,在函數體內部即可以操作當前的對象。
operator float() const{return this->width;
}operator float(){return Circle(width * 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() {
}