国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

面試之快速學習C++11-完美轉(zhuǎn)發(fā),nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this

這篇具有很好參考價值的文章主要介紹了面試之快速學習C++11-完美轉(zhuǎn)發(fā),nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

完美轉(zhuǎn)發(fā)及其實現(xiàn)

  1. 函數(shù)模版可以將自己的參數(shù)完美地轉(zhuǎn)發(fā)給內(nèi)部調(diào)用的其他函數(shù)。所謂完美,即不僅能準確地轉(zhuǎn)發(fā)參數(shù)的值,還能保證被轉(zhuǎn)發(fā)參數(shù)的左右值屬性不變
  2. 引用折疊:如果任一引用為左值引用,則結(jié)果為左值引用,否則為右值引用。
& && -> &
&& & -> &
& & -> &
&& && -> &&
void actualRun(int a) {
    
}
template <typename T>
void testPerfectForward(T &&param) {
    actualRun(param);
}

void testPerfectForwardMain() {
    int a = 0;
    testPerfectForward(a);
}

上述 T 為int &。 那么整個為 int & &&-> int &

回到完美轉(zhuǎn)發(fā),假設現(xiàn)在我需要轉(zhuǎn)發(fā)a,那么注意一下實現(xiàn)完美轉(zhuǎn)發(fā)需要這樣寫


template <typename T>
void testPerfectForward1(T &&param) {
    actualRun(std::forward(param));
}

forward大致實現(xiàn)原理
static_cast + &&

template <typename T>
T&& forwad(T &param) {
    return static_cast<T&&>(param);
}

注意其實std::move底層實現(xiàn)也是 static_cast

C++11 nullptr:初始化空指針

  1. #define NULL 0
#include <iostream>
using namespace std;

void isnull(void *c){
    cout << "void*c" << endl;
}
void isnull(int n){
    cout << "int n" << endl;
}
void testNull1() {
    isnull(0);
    //isnull(NULL);//Call to 'isnull' is ambiguous
    isnull((void*)NULL);
    /*
     int n
     void*c
     */
}

1 . nullptr 是 nullptr_t 類型的右值常量,專用于初始化空類型指針。nullptr_t 是 C++11 新增加的數(shù)據(jù)類型,可稱為“指針空值類型”。也就是說,nullpter 僅是該類型的一個實例對象(已經(jīng)定義好,可以直接使用),如果需要我們完全定義出多個同 nullptr 完全一樣的實例對象。

  1. nullptr 可以被隱式轉(zhuǎn)換成任意的指針類型。故如下:

void testNull2() {
    isnull(0);
    //isnull(NULL);//Call to 'isnull' is ambiguous
    isnull((void*)NULL);
    isnull(nullptr);
    
    /*
     int n
     void*c
     void*c
     */
    
}
  1. 借助執(zhí)行結(jié)果不難看出,由于 nullptr 無法隱式轉(zhuǎn)換為整形,而可以隱式匹配指針類型,因此執(zhí)行結(jié)果和我們的預期相符
void testNullMain() {
//    int *p = 0;
//    int *q = NULL;
//    testNull1(0);
//    testNull1(NULL);
}

.C++11 shared_ptr智能指針

void deleteInt(int *p) {
    delete []p;
}
void testSharedPtr () {
    std::cout << "testSharePtr: " << endl;
    //初始化空的shareptr,引用計數(shù)為0不是1
    std::shared_ptr<int> p1;
    std::shared_ptr<int> p2(nullptr);
    
    std::shared_ptr<int> p3(new int(10));
    std::shared_ptr<int> p4 = std::make_shared<int>(10);
    
    //調(diào)用拷貝構(gòu)造函數(shù)
    std::shared_ptr<int> p5(p4);  //或者 p4  = p3;
    //調(diào)用移動構(gòu)造函數(shù)
    std::shared_ptr<int> p6(std::move(p4)); //或者p6 = std::move(p4)
    
    //智能指針可以拷貝,給多個智能指針用,引用計數(shù)+1,但是普通指針,只能拷貝給一個智能指針
    int *p = new int(1);
    std::shared_ptr<int> pp1(p);
//    std::shared_ptr<int> pp2(p); //錯誤!?。?!
    
    // 在初始化 shared_ptr 智能指針時,還可以自定義所指堆內(nèi)存的釋放規(guī)則,這樣當堆內(nèi)存的引用計數(shù)為 0 時,會優(yōu)先調(diào)用我們自定義的釋放規(guī)則。在某些場景中,自定義釋放規(guī)則是很有必要的,比如,對于申請的動態(tài)數(shù)組來說,share—_ptr指針默認的釋放規(guī)則是不支持釋放數(shù)組的,值呢個自定義對于的釋放規(guī)則,如下:
    //釋放規(guī)則可以使用 C++11 標準中提供的 default_delete<T> 模板類,我們也可以自定義釋放規(guī)則:
    std::shared_ptr<int> p10(new int[10], std::default_delete<int[]>());
    std::shared_ptr<int> p11(new int[10], deleteInt);
    std::shared_ptr<int> p12(new int[10], [](int *p){delete []p;});
    
    std::shared_ptr<int> ppp1 = std::make_shared<int>(10);
    std::shared_ptr<int> ppp2(ppp1);
    
    std::cout << *ppp2 << endl;
    cout<< ppp2.use_count()<<endl;
    ppp1.reset();
    if (p1) {
        std::cout << "ppp1 is not null !"<< endl;
    } else {
        std::cout << "ppp1 is null !"<< endl;
    }
    std::cout << *ppp2 << endl;
    cout<< ppp2.use_count()<<endl;
}

1 shared_ptr<T>模板類常用成員方法
 成員方法名    功 能
 operator=()    重載賦值號,使得同一類型的 shared_ptr 智能指針可以相互賦值。
 operator*()    重載 * 號,獲取當前 shared_ptr 智能指針對象指向的數(shù)據(jù)。
 operator->()    重載 -> 號,當智能指針指向的數(shù)據(jù)類型為自定義的結(jié)構(gòu)體時,通過 -> 運算符可以獲取其內(nèi)部的指定成員。
 swap()    交換 2 個相同類型 shared_ptr 智能指針的內(nèi)容。
 reset()    當函數(shù)沒有實參時,該函數(shù)會使當前 shared_ptr 所指堆內(nèi)存的引用計數(shù)減 1,同時將當前對象重置為一個空指針;當為函數(shù)傳遞一個新申請的堆內(nèi)存時,則調(diào)用該函數(shù)的 shared_ptr 對象會獲得該存儲空間的所有權(quán),并且引用計數(shù)的初始值為 1get()    獲得 shared_ptr 對象內(nèi)部包含的普通指針。
 use_count()    返回同當前 shared_ptr 對象(包括它)指向相同的所有 shared_ptr 對象的數(shù)量。
 unique()    判斷當前 shared_ptr 對象指向的堆內(nèi)存,是否不再有其它 shared_ptr 對象再指向它。
 operator bool()    判斷當前 shared_ptr 對象是否為空智能指針,如果是空指針,返回 false;反之,返回 true。
 */

C++11 unique_ptr智能指針

unique_ptr 指針指向的堆內(nèi)存無法同其它 unique_ptr 共享,也就是說,每個 unique_ptr 指針都獨自擁有對其所指堆內(nèi)存空間的所有權(quán)

void testUniqueptr() {
    std::unique_ptr<int> p1(new int(3));
//    std::unique_ptr<int> p1(p2);
    std::unique_ptr<int> p2(std::move(p1));
    // 默認情況下,unique_ptr 指針采用 std::default_delete<T> 方法釋放堆內(nèi)存。當然,我們也可以自定義符合實際場景的釋放規(guī)則。值得一提的是,和 shared_ptr 指針不同,為 unique_ptr 自定義釋放規(guī)則,只能采用函數(shù)對象的方式。例如:
    struct myDel {
        void operator()(int *p) {
            delete p;
        }
    };
    std::unique_ptr<int, myDel> p7(new int);
//    std::unique_ptr<int, myDel> p6(new int);
    
    std::unique_ptr<int> p10(new int);
    *p10 = 10;
    //p10釋放當前所指堆的所有權(quán), 但該存儲空間不會被銷毀,轉(zhuǎn)移給了p
    int *p = p10.release();
    
    std::unique_ptr<int> p11;
    //中 p 表示一個普通指針,如果 p 為 nullptr,則當前 unique_ptr 也變成空指針;反之,則該函數(shù)會釋放當前 unique_ptr 指針指向的堆內(nèi)存(如果有),然后獲取 p 所指堆內(nèi)存的所有權(quán)(p 為 nullptr)。
    p11.reset(p);
    
//    int *p2 = p;
}

C++11 weak_ptr智能指針

weak_ptr是為了配合shared_ptr而引入的一種智能指針,它不具有普通指針的行為,沒有重載*和->兩個操作符,它的最大作用在于協(xié)助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。
weak_ptr可以從一個shared_ptr或者另一個weak_ptr對象構(gòu)造,獲得資源的觀測權(quán)。但weak_ptr沒有共享資源,它的構(gòu)造不會引起指針引用計數(shù)的增加。
使用weak_ptr的成員函數(shù)use_count()可以觀測資源的引用計數(shù),另一個成員函數(shù)expired()的功能等價于use_count()==0,但更快,表示被觀測的資源 (也就是shared_ptr的管理的資源)已經(jīng)不復存在。
weak_ptr可以使用一個非常重要的成員函數(shù)lock()從被觀測的shared_ptr 獲得一個可用的shared_ptr對象,從而操作資源。但當expired()==true的時候,lock()函數(shù)將返回一個存儲空指針的shared_ptr。

shared_from_this

#include<memory>

class Test: public std::enable_shared_from_this<Test>
{
 public:  
  Test();
  ~Test();
  std::shared_ptr<Test> getSharedFromThis(){return shared_from_this();}
}

在什么情況下要使類A繼承enable_share_from_this?

使用場合:當類A被share_ptr管理,且在類A的成員函數(shù)里需要把當前類對象作為參數(shù)傳給其他函數(shù)時,就需要傳遞一個指向自身的share_ptr。

我們就使類A繼承enable_share_from_this,然后通過其成員函數(shù)share_from_this()返回當指向自身的share_ptr。

以上有2個疑惑:

1.把當前類對象作為參數(shù)傳給其他函數(shù)時,為什么要傳遞share_ptr呢?直接傳遞this指針不可以嗎?

一個裸指針傳遞給調(diào)用者,誰也不知道調(diào)用者會干什么?假如調(diào)用者delete了該對象,而share_tr此時還指向該對象。

2.這樣傳遞share_ptr可以嗎?share_ptr

這樣會造成2個非共享的share_ptr指向一個對象,最后造成2次析構(gòu)該對象。
————————————————
引用鏈接:https://blog.csdn.net/zk3326312/article/details/79108690
http://c.biancheng.net/view/3730.html文章來源地址http://www.zghlxwxcb.cn/news/detail-658194.html

到了這里,關(guān)于面試之快速學習C++11-完美轉(zhuǎn)發(fā),nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • C++11『右值引用 ‖ 完美轉(zhuǎn)發(fā) ‖ 新增類功能 ‖ 可變參數(shù)模板』

    C++11『右值引用 ‖ 完美轉(zhuǎn)發(fā) ‖ 新增類功能 ‖ 可變參數(shù)模板』

    ?個人主頁: 北 海 ??所屬專欄: C++修行之路 ??操作環(huán)境: Visual Studio 2022 版本 17.6.5 自從C++98以來,C++11無疑是一個相當成功的版本更新。它引入了許多重要的語言特性和標準庫增強,為C++編程帶來了重大的改進和便利。C++11的發(fā)布標志著C++語言的現(xiàn)代化和進步,為程序員

    2024年02月05日
    瀏覽(25)
  • 論 shared_ptr的線程安全

    今天有同事問我shared_ptr是線程更安全的嗎?我當時腦子一懵,有點不確定。 但回過神來仔細一想這什么鳥問題,c++ stl里有線程安全的嗎,shared_ptr 也不是針對線程安全而設計出來的呀,八竿子打不著的東西為什么會湊在一起問。 好像也就一個atmoic引用計數(shù)可以沾上邊。 首先

    2024年02月08日
    瀏覽(19)
  • C++智能指針shared_ptr詳解

    C++智能指針shared_ptr詳解

    C++智能指針shared_ptr是一種可以自動管理內(nèi)存的智能指針,它是C++11新增的特性之一。與傳統(tǒng)指針不同,shared_ptr可以自動釋放所管理的動態(tài)分配對象的內(nèi)存,并避免了手動釋放內(nèi)存的繁瑣操作,從而減少了內(nèi)存泄漏和野指針的出現(xiàn)。 shared_ptr是一個模板類,通過引用計數(shù)器實現(xiàn)

    2023年04月22日
    瀏覽(32)
  • C++智能指針shared_ptr用法

    C++智能指針shared_ptr用法

    寫在前面的總結(jié): 一個shared_ptr對象管理一個指針(new T,在堆空間),多個shared_ptr對象可以管理同一個指針,只有某個shared_ptr對象第一次初始化指針時才執(zhí)行指針的構(gòu)造函數(shù),管理同一個指針的shared_ptr對象個數(shù)稱為引用計數(shù),這個引用計數(shù)保存在每個管理該指針的shared_p

    2024年02月03日
    瀏覽(21)
  • 【C++干貨鋪】C++11新特性——右值引用、移動構(gòu)造、完美轉(zhuǎn)發(fā)

    【C++干貨鋪】C++11新特性——右值引用、移動構(gòu)造、完美轉(zhuǎn)發(fā)

    ========================================================================= 個人主頁點擊直達:小白不是程序媛 C++系列專欄:C++干貨鋪 代碼倉庫:Gitee ========================================================================= 目錄 左值與左值引用 右值與右值引用 左值引用和右值引用的比較 ?左值引用總結(jié):

    2024年01月25日
    瀏覽(19)
  • 【C++11】 initializer_list | 右值引用 | 移動構(gòu)造 | 完美轉(zhuǎn)發(fā)

    【C++11】 initializer_list | 右值引用 | 移動構(gòu)造 | 完美轉(zhuǎn)發(fā)

    { } 初始化 C++11 擴大了括號括起的列表(初始化列表)的使用范圍,使其可用于所有的內(nèi)置類型和用戶自定義類型, 使用初始化列表,可添加等號(=),也可不添加 將1賦值給x1,x2處省略了賦值符號,將5賦值給x2 同樣也可以將new開辟4個int的空間初始化為0 創(chuàng)建對象時,可以使用列

    2024年02月08日
    瀏覽(23)
  • C++智能指針shared_ptr使用詳解

    shared_ptr 是一個共享所有權(quán)的智能指針,允許多個指針指向同一個對象。 ? shared_ptr 使用 引用計數(shù) ,每一個shared_ptr的拷貝都指向相同的內(nèi)存。每使用它一次,內(nèi)部的引用計數(shù)加1,每析構(gòu)一次,內(nèi)部的引用計數(shù)減1,減為0時,釋放所指向的堆內(nèi)存。shared_ptr內(nèi)部的引用計數(shù)是安

    2024年02月07日
    瀏覽(24)
  • shared_ptr和unique_ptr主動釋放

    shared_ptr和unique_ptr均可以采用reset()來進行釋放,unique_ptr調(diào)用了reset之后就會直接釋放掉,shared_ptr則會在所有引用計數(shù)變?yōu)?的時候才會釋放申請的內(nèi)存。 注意unique_ptr的release()方法,并不會釋放資源,只會把unique_ptr置為空指針,原來那個資源可以繼續(xù)調(diào)用 reset 結(jié)果: 在reset之

    2024年02月14日
    瀏覽(19)
  • 深入理解和應用C++ std::shared_ptr別名構(gòu)造函數(shù)

    在現(xiàn)代C++中,智能指針是一個極為重要的工具,尤其std::shared_ptr以其自動內(nèi)存管理、引用計數(shù)和多線程安全性等特性深受開發(fā)者喜愛。其中一個不太常用但功能強大的構(gòu)造方式是 別名構(gòu)造函數(shù) ,它允許我們創(chuàng)建一個共享相同底層對象但是指向其內(nèi)部不同數(shù)據(jù)成員或子對象的

    2024年01月16日
    瀏覽(31)
  • 【C++入門到精通】智能指針 shared_ptr 簡介及C++模擬實現(xiàn) [ C++入門 ]

    【C++入門到精通】智能指針 shared_ptr 簡介及C++模擬實現(xiàn) [ C++入門 ]

    在 C++ 動態(tài)內(nèi)存管理中,除了 auto_ptr 和 unique_ptr 之外,還有一種 智能指針 shared_ptr ,它可以讓多個指針共享同一個動態(tài)資源,并且能夠自動釋放資源。 shared_ptr 通過引用計數(shù)的方式來管理內(nèi)存,能夠避免程序中出現(xiàn)懸空指針和內(nèi)存泄漏等問題 。本文將介紹 shared_ptr 的簡介和

    2024年01月22日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包