欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++--智能指針、邏輯操作符的陷阱-創(chuàng)新互聯(lián)

一.智能指針

內(nèi)存泄漏(C++主要的Bug來源)
1.動(dòng)態(tài)申請(qǐng)堆空間,用完后不歸還
2.C++語言中沒有垃圾回收機(jī)制
3.指針無法控制所指堆空間的生命周期
代碼示例

創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)站備案、服務(wù)器租用、域名申請(qǐng)、軟件開發(fā)、微信小程序定制開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個(gè)面向全國乃至全球的業(yè)務(wù)窗口:建站電話聯(lián)系:18980820575
#include <iostream>
#include <string>

using namespace std;

class Test
{
    int i;
public:
    Test(int i)
    {
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
    }
};

int main()
{
    for(int i=0; i<5; i++)
    {
        Test* p = new Test(i);

        cout << p->value() << endl;
    }

    return 0;
}

運(yùn)行的結(jié)果如圖所示
C++--智能指針、邏輯操作符的陷阱
可以看出輸出結(jié)果如預(yù)期一樣,但是指針在申請(qǐng)了內(nèi)存之后沒有進(jìn)行釋放,但當(dāng)出現(xiàn)大量的數(shù)據(jù)時(shí),程序會(huì)崩潰
智能指針的需求與目的
1.需要一個(gè)特殊的指針
2.指針生命周期結(jié)束時(shí)主動(dòng)釋放堆空間
3.一片堆空間最多只能有一個(gè)指針標(biāo)識(shí)
4.杜絕指針運(yùn)算何指針比較
解決方案
1.重載指針特征操作符(->)
2.只能通過類的成員函數(shù)重載
3.重載函數(shù)不能使用參數(shù)
4.只能定義一個(gè)重載函數(shù)
代碼示例

#include <iostream>
#include <string>
//智能指針的實(shí)現(xiàn)
using namespace std;

class Test
{
    int i;
public:
    Test(int i)
    {
        cout << "Test(int i)" << endl;
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }
};

class Pointer
{
    Test* mp;
public:
    Pointer(Test* p = NULL)
    {
        mp = p;
    }
    Pointer(const Pointer& obj)
    {
        mp = obj.mp;
        const_cast<Pointer&>(obj).mp = NULL;
    }
    Pointer& operator = (const Pointer& obj)
    {
        if( this != &obj )
        {
            delete mp;
            mp = obj.mp;
            const_cast<Pointer&>(obj).mp = NULL;
        }

        return *this;
    }
    Test* operator -> ()
    {
        return mp;
    }
    Test& operator * ()
    {
        return *mp;
    }
    bool isNull()
    {
        return (mp == NULL);
    }
    ~Pointer()
    {
        delete mp;
    }
};

int main()
{
    Pointer p1 = new Test(0);

    cout << p1->value() << endl;

    Pointer p2 = p1;

    cout << p1.isNull() << endl;

    cout << p2->value() << endl;

    return 0;
}

運(yùn)行的結(jié)果如圖所示
C++--智能指針、邏輯操作符的陷阱
可以看到,指針在在對(duì)堆空間使用完之后,會(huì)自動(dòng)釋放內(nèi)存
小結(jié)
1.指針特征操作符可以被重載
2.重載指針特征符能夠使用對(duì)象代替指針
3.智能指針只能用于指向堆空間中的內(nèi)存
4.智能指針的意義在于大程度的避免內(nèi)存問題

二.邏輯操作符的陷阱

A.邏輯運(yùn)算符的原生語義
1.操作數(shù)只有兩種值(true與false)
2.邏輯表達(dá)式不用完全計(jì)算就能確定最終值
3.最終結(jié)果只能是true或者false
代碼示例

#include <iostream>
#include <string>

using namespace std;

int func(int i)
{
    cout << "int func(int i) : i = " << i << endl;

    return i;
}

int main()
{
    if( func(0) && func(1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }

    cout << endl;

    if( func(0) || func(1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }

    return 0;
}

C++--智能指針、邏輯操作符的陷阱
Q:邏輯操作符可以重載嗎?重載邏輯操作符有什么意義?
代碼示例及結(jié)果

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int mValue;
public:
    Test(int v)
    {
        mValue = v;
    }
    int value() const
    {
        return mValue;
    }
};

bool operator && (const Test& l, const Test& r)
{
    return l.value() && r.value();
}

bool operator || (const Test& l, const Test& r)
{
    return l.value() || r.value();
}

Test func(Test i)
{
    cout << "Test func(Test i) : i.value() = " << i.value() << endl;

    return i;
}

int main()
{
    Test t0(0);
    Test t1(1);

    if( func(t0) && func(t1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }

    cout << endl;

    if( func(1) || func(0) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }

    return 0;
}

C++--智能指針、邏輯操作符的陷阱
可以從代碼及運(yùn)行結(jié)果可以看出,無論邏輯操作符是否更換兩端順序,都會(huì)對(duì)兩端數(shù)據(jù)進(jìn)行運(yùn)算
B.問題的本質(zhì)分析
1.C++通過函數(shù)調(diào)用擴(kuò)展操作符功能
2.進(jìn)入函數(shù)體前必須完成所有參數(shù)的計(jì)算
3.函數(shù)參數(shù)的計(jì)算次序是不定的
4.短路法則完全失效
短路法則
a.(表達(dá)式1)&&(表達(dá)式2) 如果表達(dá)式1為假,則表達(dá)式2不會(huì)進(jìn)行運(yùn)算,即表達(dá)式2“被短路”
b.(表達(dá)式1)||(表達(dá)式2) 如果表達(dá)式1為真,則表達(dá)式2不會(huì)進(jìn)行運(yùn)算,即表達(dá)式2“被短路
建議:實(shí)際工程開發(fā)中避免重載邏輯操作符,通過重載比較操作符代邏輯操作符重載,直接使用成員函數(shù)代替邏輯操作符重載,使用全局函數(shù)對(duì)邏輯操作符重載
小結(jié)
1.C++從語法上支持邏輯操作符重載
2.重載后的邏輯操作符不滿足短路法則
3.工程開發(fā)中不要重載邏輯操作符
4.通過重載比較操作符替換邏輯操作符重載
5.通過專用成員函數(shù)替換邏輯操作符重載

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁題目:C++--智能指針、邏輯操作符的陷阱-創(chuàng)新互聯(lián)
本文地址:http://chinadenli.net/article40/ehjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)網(wǎng)站內(nèi)鏈電子商務(wù)ChatGPT外貿(mào)網(wǎng)站建設(shè)用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化