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.當前類型->基本類型–類型轉換函數實現
類型轉換函數:將當前的類型轉換成其他類型。只能以成員函數的形式出現,也就是只能出現在類中

形式上沒有返回值,其實是隱式指明了返回值的類型。
沒有參數,因為需要將當前類對象轉換成其他類型。

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() {
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于遍歷linux的文件目錄的坑- readdir

去年給公司寫了一個配置服務器,目的是解決運維的工作量太大,而且傳送服務器需要的配置文件需要腳本傳送到各個服(每個服ip不一樣,需要scp),然后再刷新通知各個GameServer,中間有沒有傳送失敗并不得知,而且維護相當麻煩,所以我寫了這個服務器,所有區服的配置都在這里邊…

終于,我讀懂了所有Java集合——sort

Collections.sort 事實上Collections.sort方法底層就是調用的Arrays.sort方法&#xff0c;而Arrays.sort使用了兩種排序方法&#xff0c;快速排序和優化的歸并排序。 快速排序主要是對那些基本類型數據&#xff08;int,short,long等&#xff09;排序&#xff0c; 而歸并排序用于…

PRML(1)--緒論(上)多項式曲線擬合、概率論

PRML緒論1.1 多項式曲線擬合1.1.1 問題描述1.1.2 最小化平方和誤差1.1.3 多項式階數確定1.1.4 有趣問題--高階模型為什么效果不好1.1.4 數據集規模對模型的影響1.1.5 參數正則化緩解過擬合問題1.2 概率論1.2.1離散型隨機變量1.2.2 連續型隨機變量1.2.3 期望和方差1.2.4 貝葉斯概…

大數加減乘

如標題&#xff0c;不解釋。 加 #include<stdio.h> #include<string.h> int main() {char a[1000],b[1000];int i,s[1000],len1,len2,len,j;while(scanf("%s%s",a,b)!EOF) //用字符數組來儲存數{for(i0;i<1000;i)s[i]0;len1strlen(a);len2strlen(b…

在GCC和Visual Studio中使用hash_map

熟悉STL或熟悉ACM/ICPC的話&#xff0c;其中的set, map, multiset, multimap一定用過無數次了&#xff0c;它們都是用平衡二叉樹&#xff08;紅黑樹&#xff09;實現的&#xff0c;復雜度為O(lgn)。我們也知道set, map可以通過哈希來實現&#xff0c;復雜度只有O(1)&#xff0c…

C++(21)--Astah uml 畫C++類圖

Astah uml 畫C類圖1.安裝2.使用《老九學堂C課程》《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)--------------- ASTAH&#xff1a;類圖工具&#xff0c;用于理…

redis3.0.0 集群安裝詳細步驟

Redis集群部署文檔(centos6系統) &#xff08;要讓集群正常工作至少需要3個主節點&#xff0c;在這里我們要創建6個redis節點&#xff0c;其中三個為主節點&#xff0c;三個為從節點&#xff0c;對應的redis節點的ip和端口對應關系如下&#xff09; 127.0.0.1:7000 127.0.0.1:7…

Redis集群添加節點

Redis集群添加節點 1&#xff1a;首先把需要添加的節點啟動 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ cd /usr/local/cluster/7006/ vi redis.conf ##修改redis.conf中的port參數的值為7006 redis-server redis.c…

PRML(2)--緒論(下)模型選擇、緯度災難、決策論、信息論

PRML緒論1.3 模型選擇1.4 緯度災難1.5 決策論1.5.1最小錯誤分率1.5.2最小化期望損失1.5.3拒絕選項1.5.4推斷和決策1.5.5 回歸問題的損失函數1.6 信息論1.3 模型選擇 模型過復雜會造成過擬合問題&#xff0c;需要通過一些技術來降低模型的復雜度。 就最大似然而言&#xff0c;可…

leetcode112 路徑總和

給定一個二叉樹和一個目標和&#xff0c;判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;這條路徑上所有節點值相加等于目標和。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定如下二叉樹&#xff0c;以及目標和 sum 22&#xff0c; 5 / \ …

關于游戲架構設計的一些整理吧

一個大型的網落游戲服務器應該包含幾個模塊:網絡通訊,業務邏輯,數據存儲,守護監控(不是必須),其中業務邏輯可能根據具體需要,又劃分為好幾個子模塊。 這里說的模塊可以指一個進程,或者一個線程方式存在,本質上就是一些類的封裝。

linux時間輪 Timing-Wheel的實現

過一段時間上傳更新自己的心得&#xff0c;以及linux的時間輪實現 現在git上傳自己的C代碼 gitgithub.com:pbymw8iwm/Timing-Wheel.git

leetcode128 最長連續序列

給定一個未排序的整數數組&#xff0c;找出最長連續序列的長度。 要求算法的時間復雜度為 O(n)。 示例: 輸入: [100, 4, 200, 1, 3, 2] 輸出: 4 解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為4 思路&#xff1a;map記錄某個連續序列端點的最大長度。 對于數字i&#xff…

C++(22)--繼承和派生

繼承和派生1.基本概念2.實現公有繼承3.私有繼承的例子4. 繼承和組合《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)----…

Python- 解決PIP下載安裝速度慢

對于Python開發用戶來講&#xff0c;PIP安裝軟件包是家常便飯。但國外的源下載速度實在太慢&#xff0c;浪費時間。而且經常出現下載后安裝出錯問題。所以把PIP安裝源替換成國內鏡像&#xff0c;可以大幅提升下載速度&#xff0c;還可以提高安裝成功率。 國內源&#xff1a; …

leetcode102 二叉樹的層次遍歷

給定一個二叉樹&#xff0c;返回其按層次遍歷的節點值。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 例如: 給定二叉樹: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其層次遍歷結果&#xff1a; [ [3], [9,20], [15…

Windows Git客戶端搭建

最近開始做Windows 開發&#xff0c;所以找了一些windows下安裝git的教程 本文環境&#xff1a; 操作系統&#xff1a;Windows XP SP3 Git客戶端&#xff1a;TortoiseGit-1.8.16.0-32bit 一、安裝Git客戶端 全部安裝均采用默認&#xff01; 1. 安裝支撐軟件 msysgit: http://ms…

C++(23)--多態性與虛函數

多態性與虛函數1.靜態多態-重載2.動態多態-重寫2.1 向上轉換/向下轉換3.虛函數的工作原理4.純虛函數和抽象類5.補充項目(都市浮生記)-卒《老九學堂C課程》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的…

如何在Appscale下發布自己的應用(一)

本篇文章主要講如何在本地搭建appscale環境。由于國內的信息資源有限&#xff0c;很多重要的論壇被墻了&#xff0c;所以遇到不少麻煩&#xff0c;由于最近一段時間vpn也被封掉了&#xff0c;我只能通過特殊渠道方法來翻墻查閱資料&#xff0c;走了不少彎路。 1.先說系統和環境…

總結了線程安全性的二十四個精華問題

1、對象的狀態&#xff1a;對象的狀態是指存儲在狀態變量中的數據&#xff0c;對象的狀態可能包括其他依賴對象的域。在對象的狀態中包含了任何可能影響其外部可見行為的數據。 2、一個對象是否是線程安全的&#xff0c;取決于它是否被多個線程訪問。這指的是在程序中訪問對象的…