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

溫馨提示×

溫馨提示×

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

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

C++--函數對象的分析 經典問題

發布時間:2020-07-15 01:55:49 來源:網絡 閱讀:650 作者:淡淡_小孩 欄目:編程語言

一.函數對象的分析

Q:客戶的需求
1.函數可以獲得斐波那契數列每項的值
2.每調用一次返回一個值
3.函數可根據需求重復使用

for(int i=0;i<10;i++)
{
    cout<<fib()<<endl;
}

代碼示例

#include <iostream>
#include <string>

using namespace std;

int fib()
{
    static int a0=0;
    static int a1=1;

    int ret=a1;
    a1=a0+a1;
    a0=ret;

    return ret;
}
int main()
{ 
    for(int i=0; i<10; i++)
    {
        cout << fib() << endl;
    }

    cout << endl;

    for(int i=0; i<5; i++)
    {
        cout << fib() << endl;
    }

    cout << endl;

    for(int i=0; i<5; i++)
    {
        cout << fib() << endl;
    }

    return 0;
}

輸出的結果如圖所示
C++--函數對象的分析  經典問題
從代碼以及運行結果我們看到一些存在的問題
1.靜態局部變量處于函數內部,外界無法改變
2.函數位全局變量,是唯一的,無法多次獨立使用
3.無法指定某個具體的數列作為初始值

解決方案:使用函數對象
1.使用具體的對象取代函數
2.該類的對象具備函數調用的行為
3.構造函數指定具體數列項的起始位置
4.多個對象相互對立的求解數列項
函數的調用操作符C++--函數對象的分析  經典問題
1.只能通過類的成員函數重載
2.可以定義不同參數的多個重載函數
代碼示例

#include <iostream>
#include <string>

using namespace std;

class Fib
{
    int a0;
    int a1;
public:
    Fib()
    {
        a0 = 0;
        a1 = 1;
    }

    Fib(int n)
    {
        a0 = 0;
        a1 = 1;

        for(int i=2; i<=n; i++)
        {
            int t = a1;

            a1 = a0 + a1;
            a0 = t;
        }
    }

    int operator () ()
    {
        int ret = a1;

        a1 = a0 + a1;
        a0 = ret;

        return ret;
    }
};

int main()
{
    Fib fib;

    for(int i=0; i<10; i++)
    {
        cout << fib() << endl;
    }

    cout << endl;

    for(int i=0; i<5; i++)
    {
        cout << fib() << endl;
    }

    cout << endl;

    Fib fib2(10);

    for(int i=0; i<5; i++)
    {
        cout << fib2() << endl;
    }

    return 0;
}

運行結果如圖所示
C++--函數對象的分析  經典問題
從多次的運行結果可以看出,對之前存在的問題進行改正,完成了需求
小結
1.函數調用操作符C++--函數對象的分析  經典問題是可以重載的
2.函數調用操作符只能通過類的成員函數重載
3.函數調用操作符可以定義不同參數的多個重載指針
4.函數對象用于在工程中取代函數指針

二.經典問題分析

Q:關于賦值的疑問
1.編譯器為每個類默認重載了賦值操作符
2.默認的賦值操作符僅完成淺拷貝
3.當需要進行深拷貝時必須重載賦值操作符
4.賦值操作符與拷貝構造函數有相同的存在意義
代碼示例

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int* m_pointer;
public:
    Test()
    {
        m_pointer = NULL;
    }
    Test(int i)
    {
        m_pointer = new int(i);
    }
    Test(const Test& obj)
    {
        m_pointer = new int(*obj.m_pointer);
    }

    void print()
    {
        cout << "m_pointer = " << hex << m_pointer << endl;
    }
    ~Test()
    {
        delete m_pointer;
    }
};

int main()
{
    Test t1 = 1;
    Test t2;

    t2 = t1;

    t1.print();
    t2.print();

    return 0;
}

運行結果如圖所示
C++--函數對象的分析  經典問題
分析:在代碼中由于將t1賦值給t2,導致t1與t2指向的是同一個地址,而在使用完之后,對內存進行釋放時對同一個地址釋放了兩次,這個操作在計算機內部會造成錯誤
C++--函數對象的分析  經典問題
Q:關于string的疑問
下面的代碼輸出是什么?

string  s="123456";
const char *p=s.c_str();
cout<<p<<endl;
s.append("abced");
cout<<p<<endl;

如上所示的代碼想完成的是在字符串123456后面添加abced
可實際的運行結果如圖所示
C++--函數對象的分析  經典問題
分析
C++--函數對象的分析  經典問題
小結
1.在需要進行深拷貝的時候必須重載賦值操作符
2.賦值操作符何拷貝構造函數又同等重要的意義

向AI問一下細節

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

AI

新野县| 海林市| 新建县| 闽侯县| 宕昌县| 勐海县| 渭源县| 布拖县| 康定县| 阿拉尔市| 西和县| 高陵县| 新乐市| 金乡县| 尼木县| 阿巴嘎旗| 多伦县| 侯马市| 丰镇市| 古交市| 舟曲县| 若尔盖县| 建湖县| 祁门县| 侯马市| 三穗县| 阳东县| 安陆市| 金塔县| 长乐市| 丹寨县| 闻喜县| 南江县| 加查县| 正镶白旗| 黑水县| 宽甸| 胶南市| 道孚县| 门源| 平顺县|