pointer-like class 和 function-like class

pointer-like class

什么是

讓一個類像 pointer 一樣,對 * 和 -> 這兩個符號重載了。

為什么要

在單獨的指針基礎上有更多的功能。比如 shard_ptr,比如迭代器。

具體例子

  • shard_ptr
template<class T>
class shard_ptr {
public:
    shard_ptr(T* p):px(p){}
    T& operator*() const {
        return *px;
    }
    T* operator->() const {
        return px;
    }

private:
    T* px;
    long* pn;
//    ...
};

現(xiàn)在看這個很奇怪的例子:

class Foo {
public:
    void fun1() {}
};

int main() {

    shard_ptr<Foo>sp(new Foo);

    sp->fun1();

    return 0;
}

上面的 sp 是一個 shard_ptr。sp 首先調用了 operator->() 返回了原來的 Foo*。但是 -> 不是消耗了 -> 符號嗎?為什么之后還有。原來 C++ 規(guī)定對于調用->操作符后,->操作符并不消耗掉,而是會繼續(xù)作用下去。

  • 迭代器

參考

  • 侯捷《面向對象高級編程(下)》

function-like class

什么是

就是一個重載了 () 的類,讓這個類的對象看起來能像一個函數(shù)一樣。

為什么要

我感覺可以讓代碼更靈活,更短。

具體例子

我們首先看一個把 vector 中的所有數(shù)字加上 42 的例子。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int add42(const int& x) {
    return x + 42;
}

int main() {
    vector<int> v1 = {1, 2, 3, 4, 5};
    vector<int> v2(v1.size());

    transform(v1.begin(), v1.end(), v2.begin(), add42);

    for(auto v : v2) {
        cout << v << '\n';
    }

    return 0;
}

如果需求改了,需要加上 21 需要加上 100 就得需要多定義兩個函數(shù)。但是使用 functor 就可以避免這樣的冗余,像這樣:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class add_x {
public:
    add_x(const int& x):x(x){}
    int operator() (const int& t) const {
        return t + x;
    }
private:
    int x;
};

int main() {
    vector<int> v1 = {1, 2, 3, 4, 5};
    vector<int> v2(v1.size());


    add_x add42(42);
    add_x add21(21);
    add_x add100(100);

    transform(v1.begin(), v1.end(), v2.begin(), add42);
    transform(v1.begin(), v1.end(), v2.begin(), add21);
    transform(v1.begin(), v1.end(), v2.begin(), add100);

    return 0;
}

參考

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容