【C++的深度剖析教程20】类型转换函数上
今天來學(xué)習(xí)類型轉(zhuǎn)換函數(shù)。
一回顧
我們學(xué)習(xí)C語言的時(shí)候,都知道,標(biāo)準(zhǔn)的數(shù)據(jù)類型之間,是可以做類型的轉(zhuǎn)換的。分為隱式類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。那么強(qiáng)制類型轉(zhuǎn)換呢,比較簡單。但是隱式類型轉(zhuǎn)換,卻存在諸多問題。下面我們看一下隱式類型轉(zhuǎn)換,是如何轉(zhuǎn)換的:
轉(zhuǎn)換規(guī)則如下:
隱式類型轉(zhuǎn)換只能是小類型轉(zhuǎn)換為大類型,這樣可以避免數(shù)據(jù)的損壞不完整。上圖顯示的就是,只能朝著箭頭方向進(jìn)行隱式的類型轉(zhuǎn)換,而不能反過來進(jìn)行隱式轉(zhuǎn)換。
下面還是先分析一個(gè)例子:
#include <iostream> #include <string>using namespace std;int main() { short s = 'a'; //char類型可以隱式的轉(zhuǎn)換為short類型unsigned int ui = 1000; //int類型可以隱式的轉(zhuǎn)換為unsigned int類型。int i = -2000; double d = i; //int型可以隱式的轉(zhuǎn)換為double類型cout << "d = " << d << endl;cout << "ui = " << ui << endl;cout << "ui + i = " << ui + i << endl;//這里我們預(yù)期應(yīng)該是得到負(fù)的值,但是結(jié)果卻不是if( (ui + i) > 0 ){cout << "Positive" << endl;}else{cout << "Negative" << endl;}cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;/* 這里s為short類型2字節(jié),‘b’為char類型1字節(jié),做加法運(yùn)算后,char類型為什么沒有隱式轉(zhuǎn)換* short類型呢?而是將這兩個(gè)類型都轉(zhuǎn)換為int類型?因?yàn)榫幾g器認(rèn)為int類型的計(jì)算是* 最為高效的,而short類型與char類型轉(zhuǎn)換為int類型又是安全可行的,所以編譯器就直接把* 他們轉(zhuǎn)換為int類型進(jìn)行計(jì)算*/return 0; }運(yùn)行結(jié)果為:
d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + ‘b’) = 4
分析:
程序的分析,上面已經(jīng)寫的很清楚了。從此也可以看出隱式轉(zhuǎn)換存在一定的隱患。
二再論構(gòu)造函數(shù)
問題:
普通類型與類類型之間能否進(jìn)行類型轉(zhuǎn)換,類類型之間能否進(jìn)行類型轉(zhuǎn)換?
回答:
當(dāng)然是可以的!!!只不過這里需要先引入一個(gè)概念:轉(zhuǎn)換構(gòu)造函數(shù)。那么什么是轉(zhuǎn)換構(gòu)造函數(shù)呢?
我們知道,構(gòu)造函數(shù)可以有不同類型的參數(shù),當(dāng)參數(shù)滿足下列條件時(shí),成為轉(zhuǎn)換構(gòu)造函數(shù):
- 有且僅有一個(gè)參數(shù)
- 參數(shù)是基本類型
- 參數(shù)是其他類型
那么轉(zhuǎn)換構(gòu)造函數(shù),有什么意義呢?在說明轉(zhuǎn)換構(gòu)造函數(shù)之前,我們看一下下圖:
上圖,說明,C方式中的舊標(biāo)準(zhǔn)普通類型之間進(jìn)行的強(qiáng)制類型轉(zhuǎn)換的格式,以及類似的類類型與普通類型之間的轉(zhuǎn)換的格式。上圖類類型的轉(zhuǎn)換,實(shí)際上是屬于隱式類型的轉(zhuǎn)換(可以詳細(xì)看一下視頻課程中的逐步索引,這里我就直接給出結(jié)論了),但是隱式類型轉(zhuǎn)換呢,在工程開發(fā)中是存在諸多隱患的,是程序中BUG的重要來源。
所以我們一般在開發(fā)中,都不使用隱式轉(zhuǎn)換,而使用顯示轉(zhuǎn)換:
轉(zhuǎn)換構(gòu)造函數(shù)被explicit修飾時(shí)只能進(jìn)行顯示轉(zhuǎn)換:
- 轉(zhuǎn)換方式:
- static_cast(value);
- ClassName(value); //不推薦
說了這么多,還是直接寫代碼分析吧:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(){mValue = 0;}explicit Test(int i) //轉(zhuǎn)換構(gòu)造函數(shù){mValue = i;}Test operator + (const Test& p){Test ret(mValue + p.mValue);return ret;}int value(){return mValue;} };int main() { Test t;t = static_cast<Test>(5); // t = Test(5);顯示轉(zhuǎn)換cout << t.value() << endl;Test r;r = t + static_cast<Test>(10); // r = t + Test(10); 顯示轉(zhuǎn)換cout << r.value() << endl;return 0; }運(yùn)行結(jié)果為:
5
15
分析與結(jié)論:
上面的程序,可以看出,當(dāng)我們想讓普通類型int類型,與類類型的值進(jìn)行運(yùn)算時(shí),首先需要把int類型轉(zhuǎn)換為類類型(轉(zhuǎn)化為一個(gè)臨時(shí)的類類型)然后再進(jìn)行運(yùn)算。類類型的轉(zhuǎn)換,需要顯示進(jìn)行,前面加上前綴:static_cast<calss>(int),就可以進(jìn)行轉(zhuǎn)換了,同時(shí)呢,轉(zhuǎn)換還需要一個(gè)轉(zhuǎn)換構(gòu)造函數(shù),轉(zhuǎn)換構(gòu)造函數(shù)前面也需要加上前綴:explicit。轉(zhuǎn)換的時(shí)候是調(diào)用這個(gè)轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行轉(zhuǎn)換的。
三總結(jié):
想一起探討以及獲得各種學(xué)習(xí)資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關(guān)于嵌入式,操作系統(tǒng),C++語言,C語言,數(shù)據(jù)結(jié)構(gòu)等技術(shù)問題。
總結(jié)
以上是生活随笔為你收集整理的【C++的深度剖析教程20】类型转换函数上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货分享 ▎软考论文怎么写?
- 下一篇: QT安装具体图解