91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C++--智能指針、邏輯操作符的陷阱

發布時間:2020-07-04 20:38:26 來源:網絡 閱讀:441 作者:淡淡_小孩 欄目:編程語言

一.智能指針

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

#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;
}

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

#include <iostream>
#include <string>
//智能指針的實現
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;
}

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

二.邏輯操作符的陷阱

A.邏輯運算符的原生語義
1.操作數只有兩種值(true與false)
2.邏輯表達式不用完全計算就能確定最終值
3.最終結果只能是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:邏輯操作符可以重載嗎?重載邏輯操作符有什么意義?
代碼示例及結果

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

向AI問一下細節

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

AI

杭锦后旗| 台前县| 邓州市| 连江县| 武夷山市| 中山市| 东城区| 丹东市| 淅川县| 莱芜市| 柘城县| 宣汉县| 德格县| 土默特右旗| 长丰县| 高邮市| 五大连池市| 伊金霍洛旗| 牡丹江市| 隆尧县| 喜德县| 新邵县| 九台市| 龙泉市| 尼勒克县| 乡城县| 陇西县| 天柱县| 阿尔山市| 古蔺县| 中宁县| 虎林市| 溆浦县| 新龙县| 承德市| 肃北| 武邑县| 宁陵县| 泰安市| 嵊泗县| 宁波市|