中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++如何實現類型轉換

發布時間:2021-10-08 09:33:16 來源:億速云 閱讀:168 作者:小新 欄目:開發技術

這篇文章主要介紹了C++如何實現類型轉換,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    C++對于內置類型有隱式或顯式的類型轉化,如int,double,long,char,但是,C++還有類這個概念,類是一種自定義類型,為了讓類(自定義類型)達到內置類型的層次,C++對類也挺提供一些方法進行自動或者強制類型轉換
    C++的好多工作,在我看來就是讓自定義類型能和內置類型一樣簡單使用、操作。

    內置類型的轉換

    int a = 8;
    	double b = 4.4;
    	long c = a;//隱式類型轉換
    	long d = (long)b;//顯式類型轉換

    這都是我們熟悉的,是編譯器已經幫我們處理好了的。

    自定義類型轉換

    對于自定義類型,其類型轉換,都是我們可以自己實現,自己控制的。

    /*
    * 對石塊類的 聲明定義
    */
    class Stone
    {
    public:
    	Stone(double weight);
    	Stone(int stone_type, double volume);
    private:
    	int _stone_type;
    	double _weight;
    	double _volume;
    };
    Stone::Stone(double weight)
    {
    	_stone_type = 1;
    	_weight = weight;
    	_volume = 10.5;
    }
    Stone::Stone(int stone_type, double volume=10.5)
    {
    	_stone_type = stone_type;
    	_weight = 5.8;
    	_volume = volume;
    }

    我們提供了Stone(double) 這個構造函數的重載,可以直接將double類型進行構造出一個類。

    	Stone s1 = 24.5;
    	Stone s2(10.5);
    	Stone s3(21, 20.5);

    對于Stone s1 = 24.5;而言,重新是由構造函數Stone(double)來創建一個臨時的Stone對象,并將24.5作為初始值,隨后,采用逐成員復值的方法,將該臨時對象的內容復制到s1對象中。也就是將一個double類型的對象轉換為Stone類型的對象。

    這一過程稱為隱式轉換,它是自動進行的,不需要顯式遷至類型轉換。

    注意:只有接受一個參數的構造函數才能作為轉換函數,

    像Stone(int stone_type, double volume)有兩個參數,因此不能用來轉換類型,然而,如果它第二代參數是個缺省,提供了默認值,其便可以用來進行int對象的轉換。
    這個轉換函數是將那些其他(內置或者其他的類型)類型向類類型轉換

    explicit 關鍵字

    將構造函數用作于自動類型轉換函數似乎是一項不錯的特性,但是這種自動轉換的并不是在所有情況下都需要,某些情況下,不需要這種轉換,但是卻意外的進行了轉換。

    所以C++提供了關鍵字explicit,用于關閉這種自動轉換。

    explicit的意思是:顯式的,明確的。

    可以加在函數聲明前

    explicit Stone(double weight)

    這樣,只能顯式調用這個構造。

    C++如何實現類型轉換

    Stone s1 = Stone(24.5);
    Stone s4 = (Stone)19.99;//非常像內置類型的顯式轉換

    這樣顯式調用就沒什么問題。

    提醒

    還有一個要提醒的:如果像這個一樣,

    C++如何實現類型轉換

    有兩個參數的函數,

    C++如何實現類型轉換

    有一個加了explicit,另一個沒加,如果還像剛才一樣,隱式轉換的那種,還是能泡過的,因為,會執行兩個參數的構造函數,因為就這個是能匹配的,這肯會造成一個隱患,給大家提個醒,要加explicit,構成重載的函數最好都加上,不然出來Bug就不好找了。

    提問:編譯器在什么時候使用Stone(double)?

    如果在聲明中使用了關鍵字explicit,則Stone(double)將只能用于顯式強制類型轉換,
    如果沒有的話,就還能用于隱式類型轉換

    • 將Stone對象初始化為double值時,例:Stone s1 = 24.5;

    • double值賦給Stone對象,例:Stone s5;s5 = 19.7;

    • 將double值傳遞給接受Stone參數的函數,例:

    void Print(const Stone& tmp) 
    {cout << "Print" << endl;}
    Print(19.7);
    • 返回值被聲明為Stone類型的函數試圖返回double。

    • 在上述任意一種情況下,使用可轉換為double類型的內置類型時(只要能轉換成double類型的內置類型對象,都能這樣隱式調用)

    Stone s5;
    	s5 = 19;
    	Stone s6(100);

    同時,要記住編譯器不能處理具有二義性的調用。

    轉換函數

    概念介紹

    上面也介紹過轉換函數,

    不過那是內置類型轉換為類類型,
    這里的是類類型轉換為內置類型。

    轉換函數的形式:operator typeName();

    1.轉換函數必須是類方法

    2.轉換函數不能指定返回類型

    3.轉換函數不能有參數

    例如:轉換為double類型的函數原型:

    operator double();

    typeName(這里指 double ,因此就不需要指定返回類型。轉換函數是類方法意味著:它需要類對象來調用,從而告知函數要轉換的值。因此,函數不需要函數。

    Stone::operator double() const
    {
    	return _weight;
    }
    
    Stone s4 = (Stone)19.99;
    double d1 = s4;//隱式調用
    double d2 = (double)s4;//顯式
    double d3 = double(s4);//顯式

    且這調用的都是轉換函數。

    自動引用類型轉換

    double d1 = s4;//隱式調用

    都是自動轉換。

    還有賦值的情況,可能會存在內置類型之間的轉換。

    long l1 = s4;

    這里可沒有long的轉換函數,說明是轉化為double后,又轉換為了long類型。

    缺陷

    轉換函數都存在缺陷。

    提供自動調用、隱式轉換的函數存在的問題:使用者不希望轉換時,轉換函數也可能進行了轉換。

    所以最好還是要加上explicit,只有顯式調用時,才能進行轉換。

    或者,使用一些功能相同的類方法來繼續代替,這樣,如果類成員又類型一樣的也能轉換。

    double Stone::Stone_to_double_weight(void)
    {
    	return _weight;
    }
    double Stone::Stone_to_double_volume(void)
    {
    	return _volume;
    }

    我覺得這玩意比那個還好用一些。

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++如何實現類型轉換”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    遵义县| 新密市| 清水县| 崇义县| 怀远县| 西乌珠穆沁旗| 甘泉县| 公主岭市| 卢氏县| 无极县| 阜康市| 荣昌县| 榆社县| 宁乡县| 格尔木市| 会昌县| 桂东县| 板桥市| 磐石市| 年辖:市辖区| 慈利县| 聊城市| 揭阳市| 琼海市| 武胜县| 宁化县| 农安县| 乌鲁木齐县| 德令哈市| 都江堰市| 周宁县| 岳阳县| 南江县| 广东省| 景德镇市| 肇州县| 旺苍县| 新竹市| 汶上县| 建水县| 安塞县|