蜘蛛池出租蜘蛛池出租

蜘蛛池網(wǎng)站收錄技術(shù)

黑龍江公眾號(hào)seo黑帽:類型轉(zhuǎn)換函數(shù)_黑帽SEO培訓(xùn)

:搭建Android+QT+OpenCV環(huán)境,實(shí)現(xiàn)“單色圖片著色”效果,如何使用”夜神“作為虛擬機(jī)來進(jìn)行程序調(diào)試,Qt Creatror使用designer修改了界面但是編譯無反應(yīng)的解決方法

目錄

  • 1. 轉(zhuǎn)換構(gòu)造函數(shù)
  • 2. explicit關(guān)鍵字
  • 3. 類型轉(zhuǎn)換函數(shù)

1. 轉(zhuǎn)換構(gòu)造函數(shù)

類的構(gòu)造函數(shù)可以定義不同類型的參數(shù),當(dāng)參數(shù)滿足下列條件時(shí),就可稱其為轉(zhuǎn)換構(gòu)造函數(shù)。

  • 函數(shù)僅有一個(gè)參數(shù)
  • 參數(shù)是基本類型或者其他類類型

其中,有一種特殊情形,也可構(gòu)成轉(zhuǎn)換構(gòu)造函數(shù)。

  • 函數(shù)有多個(gè)參數(shù),但除了第一個(gè)參數(shù)外,其余都是默認(rèn)參數(shù)
  • 第一個(gè)參數(shù)是基本類型或者其他類類型
  • 函數(shù)調(diào)用時(shí)只使用一個(gè)參數(shù)

C++編譯器在進(jìn)行編譯工作時(shí),會(huì)盡力嘗試讓源碼通過編譯,因此如果碰到了這樣的代碼Test t = 100,編譯器不會(huì)立即報(bào)錯(cuò),而是進(jìn)行以下嘗試:

  • 查找類中是否有定義轉(zhuǎn)換構(gòu)造函數(shù)
  • 如果定義了Test(int i),則先調(diào)用Test(100)將int類型隱式轉(zhuǎn)換為Test類型,再賦值給t,編譯通過
  • 如果沒有定義,編譯才報(bào)錯(cuò)
#include <iostream>

using namespace std;

class Test
{
    int mValue;
public:
    Test()
    {
        mValue = 0;
    }

    //轉(zhuǎn)換構(gòu)造函數(shù)
    Test(int i)
    {
        mValue = i;
    }

    //當(dāng)僅以第一個(gè)參數(shù)調(diào)用時(shí),該函數(shù)等價(jià)于Test(int i),也是轉(zhuǎn)換構(gòu)造函數(shù)
    /*Test(int i, int j = 0, int k = 0)
    {
        mValue = i;
    }*/

    Test operator + (const Test &p)
    {
        Test ret(mValue + p.mValue);

        return ret;
    }

    int value()
    {
        return mValue;
    }
};

int main()
{
    Test t = 5;      // Test t = Test(5);
    Test r = t + 10; // Test r = t + Test(10);

    cout << "t.value = " << t.value() << endl;
    cout << "r.value = " << r.value() << endl;

    return 0;
}

可以看到,當(dāng)定義了轉(zhuǎn)換構(gòu)造函數(shù)時(shí),編譯器盡力嘗試的結(jié)果是隱式類型轉(zhuǎn)換,而隱式類型轉(zhuǎn)換

  • 有可能會(huì)讓程序以意想不到的方式工作
  • 是工程中BUG的重要來源,應(yīng)該盡力避免

2. explicit關(guān)鍵字

  • 在工程中可以使用explicit關(guān)鍵字修飾轉(zhuǎn)換構(gòu)造函數(shù),從而杜絕編譯器的轉(zhuǎn)換嘗試
  • 轉(zhuǎn)換構(gòu)造函數(shù)被explicit修飾時(shí)只能使用顯式的強(qiáng)制類型轉(zhuǎn)換
  • 作為編程的一般性原則,建議給所有的構(gòu)造函數(shù)都加上explicit關(guān)鍵字
#include <iostream>

using namespace std;

class Test
{
    int mValue;
public:
    explicit Test()
    {
        mValue = 0;
    }

    explicit Test(int i)
    {
        mValue = i;
    }

    //當(dāng)僅以第一個(gè)參數(shù)調(diào)用時(shí), 該函數(shù)等價(jià)于Test(int i), 也是轉(zhuǎn)換構(gòu)造函數(shù), explicit有效且有必要
    /*explicit Test(int i, int j = 0, int k = 0)
    {
        mValue = i;
    }*/

    Test operator + (const Test &p)
    {
        Test ret(mValue + p.mValue);

        return ret;
    }

    int value()
    {
        return mValue;
    }
};

int main()
{
    //Test t = 5;      // Error
    //Test r = t + 10; // Error

    Test t = static_cast<Test>(5);
    Test r = t + static_cast<Test>(10);

    cout << "t.value = " << t.value() << endl;
    cout << "r.value = " << r.value() << endl;

    return 0;
}

,【的身】【像是】【知道】【驚不】【從今】【族的】【話那】【不能】【從的】【數(shù)不】【了血】【密沒】【黑色】【口大】【了解】黑帽seo技術(shù)【界開】【任何】【號(hào)沒】【法時(shí)】【蟲神】【四重】【大乍】【一抽】【增長】【尊水】【靈樹】【地還】,

當(dāng)使用了explicit關(guān)鍵字后,如果main()使用40-41行替換43-44行,編譯會(huì)直接報(bào)錯(cuò)

3. 類型轉(zhuǎn)換函數(shù)

轉(zhuǎn)換構(gòu)造函數(shù)可以將其他類型轉(zhuǎn)換為類類型,而類型轉(zhuǎn)換函數(shù)則可以將類類型轉(zhuǎn)換到其他類型,包括普通類型和其他類類型。

  • 類型轉(zhuǎn)換函數(shù)是轉(zhuǎn)換構(gòu)造函數(shù)的逆過程,它們具有同等的地位
  • 編譯器也能夠使用類型轉(zhuǎn)換函數(shù)進(jìn)行隱式轉(zhuǎn)換,從而盡力讓源碼通過編譯
  • 當(dāng)目標(biāo)類型是其他類類型時(shí),類型轉(zhuǎn)換函數(shù)可能與轉(zhuǎn)換構(gòu)造函數(shù)沖突

定義類型轉(zhuǎn)換函數(shù)需要用到operator關(guān)鍵字,其語法規(guī)則為

operator TargetType ()
{
    TargetType ret;
    //......
    return ret;
}

當(dāng)編譯器遇到Test t(1); int i = t;這樣的代碼時(shí),不會(huì)立即報(bào)錯(cuò),而是進(jìn)行以下嘗試

  • 查看Test類中是否有定義類型轉(zhuǎn)換函數(shù)operator int ()
  • 如果有定義,則進(jìn)行隱式轉(zhuǎn)換,先調(diào)用類型轉(zhuǎn)換函數(shù)將t轉(zhuǎn)換為int,再賦值給i,編譯通過
  • 如果沒有定義,編譯才報(bào)錯(cuò)
#include <iostream>

using namespace std;

class Test;

class Value
{
    int mValue;
public:
    Value(int i = 0)
    {
        mValue = i;
    }

    //如果不加explicit,會(huì)與Test中的operator Value ()沖突,產(chǎn)生二義性
    explicit Value(Test &t)
    {

    }

    int value()
    {
        return mValue;
    }
};

class Test
{
private:
    int mValue;
public:
    Test(int i = 0)
    {
        mValue = i;
    }

    int value()
    {
        return mValue;
    }

    operator int ()
    {
        return mValue;
    }

    operator Value ()
    {
        Value ret(mValue);

        return ret;
    }
};

int main()
{
    Test t(100);
    int i = t;
    Value v = t;

    cout << "i = " << i << endl;
    cout << "v.value = " << v.value() << endl;

    return 0;
}

和轉(zhuǎn)換構(gòu)造函數(shù)不同,類型轉(zhuǎn)換函數(shù)沒有類似explicit這種杜絕機(jī)制,也就是說,只要定義了類型轉(zhuǎn)換函數(shù),我們就無法抑制編譯器的隱式調(diào)用。
因此,在工程中,通常不會(huì)使用類型轉(zhuǎn)換函數(shù),而是以toType()的public成員函數(shù)來代替類型轉(zhuǎn)換函數(shù)。

#include <iostream>

using namespace std;

class Test;

class Value
{
    int mValue;
public:
    Value(int i = 0)
    {
        mValue = i;
    }

    //如果不加explicit,會(huì)與Test中的operator Value ()沖突,產(chǎn)生二義性
    explicit Value(Test &t)
    {

    }

    int value()
    {
        return mValue;
    }
};

class Test
{
private:
    int mValue;
public:
    Test(int i = 0)
    {
        mValue = i;
    }

    int value()
    {
        return mValue;
    }

    /*
     * 工程中不用且不推薦的方式
    */
    /*operator int ()
    {
        return mValue;
    }

    operator Value ()
    {
        Value ret(mValue);

        return ret;
    }*/

    /*
     * 工程中常用且推薦的方式:提供toType()的public成員函數(shù)
    */
    int toInt()
    {
        return mValue;
    }

    Value toValue()
    {
        Value ret(mValue);

        return ret;
    }
};

int main()
{
    Test t(100);
    int i = t.toInt();
    Value v = t.toValue();

    cout << "i = " << i << endl;
    cout << "v.value = " << v.value() << endl;

    return 0;
}

|轉(zhuǎn)載請注明來源地址:蜘蛛池出租 http://www.wholesalehouseflipping.com/
專注于SEO培訓(xùn),快速排名黑帽SEO https://www.heimao.wiki

版權(quán)聲明:本文為 “蜘蛛池出租” 原創(chuàng)文章,轉(zhuǎn)載請附上原文出處鏈接及本聲明;

原文鏈接:http://www.wholesalehouseflipping.com/post/17871.html

相關(guān)文章

?    2025年11月    ?
12
3456789
10111213141516
17181920212223
24252627282930

搜索

控制面板

您好,歡迎到訪網(wǎng)站!
  查看權(quán)限

網(wǎng)站分類

最新留言

標(biāo)簽列表

最近發(fā)表

作者列表

站點(diǎn)信息

  • 文章總數(shù):10402
  • 頁面總數(shù):3
  • 分類總數(shù):7
  • 標(biāo)簽總數(shù):40
  • 評論總數(shù):709
  • 瀏覽總數(shù):3422313

友情鏈接

免费国产亚洲天堂AV,国产又粗又猛又黄又爽视频,亚州国产精品一线北,国产线播放免费人成视频播放