• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            小山日志
            讀書,學(xué)習(xí)與思考.
            posts - 9,comments - 14,trackbacks - 0

            2. 函數(shù)模板 checked_delete() checked_array_delete()

            <boost/checked_delete.hpp> 定義了兩個(gè)函數(shù)模板 checked_delete checked_array_delete 還有兩個(gè)類模板 checked_deleter checked_array_deleter。

            當(dāng)我們利用指針刪除一個(gè)對(duì)象的時(shí)候,對(duì)象類型是否完整決定了對(duì)象是否能夠被正確刪除。但是,如果你用 delete 去刪除一個(gè)類型并不完整的對(duì)象的指針,編譯器并不會(huì)給你提供任何錯(cuò)誤信息(好吧,有些編譯器會(huì)給出警告信息,但是程序員通常會(huì)忽略警告信息),但是這樣做的結(jié)果卻是對(duì)象的析構(gòu)函數(shù)根本就沒(méi)有被調(diào)用。

            所以,我們應(yīng)當(dāng)使用更嚴(yán)厲的手段禁止這種事情的發(fā)生。比如說(shuō)使用 checked_delete 代替 delete 來(lái)刪除指針。當(dāng)指針?biāo)赶虻氖且粋€(gè)不完全類型時(shí), checked_delete 會(huì)使編譯器發(fā)出錯(cuò)誤信息。

            class ?test; // 有聲明,但是忘記了定義,或是忘記????
            ??????????
            // 包含定義文件,test是一個(gè)不完全類型

            main()
            {
            test?
            * ?pt? = ?NULL;
            delete?pt;??
            //
            ?有時(shí)會(huì)有警告信息,
            ????????????
            // 但有時(shí)什么都沒(méi)有。

            checked_delete(pt);? // ?發(fā)出錯(cuò)誤信息。
            }

            checked_array_delete 是用來(lái)對(duì)應(yīng)于 delete [ ] operator checked_deleter checked_array_deleter 是可以配接的仿函數(shù)版本。

            3. 函數(shù)模板 next() prior()
            包括

            template < class T > T?next(T?x);
            template
            < class T, class ?Distance >
            T?next(T?x,?Distance?n);
            template
            < class T >
            T?prior(T?x);
            template
            < class T, class ?Distance >
            T prior(T?x,?Distance?n);

            函數(shù)模板對(duì)傳入的指針,智能指針或是迭代器做遞增或遞減,并傳回它。用法如下:

            const ?std::list < T > ::iterator?p? = ?get_some_iterator();
            const ?std::list < T > ::iterator?prev? =
            ?boost::prior(p);
            const ?std::list < T > ::iterator?next? = ?boost::next(prev,? 2 );

            事實(shí)上, T next(T x) T prior(T x) 將分別調(diào)用 operator++ operator-- ,而 T next(T x, Distance n) T prior(T x, Distance n) 則調(diào)用 std::distance(T x, size_t n)

            4.noncopyable

            如果你需要設(shè)計(jì)一個(gè)不可以被復(fù)制的類,那么你就要明確地將它的拷貝構(gòu)造函數(shù)和 operator = () 放到 private 聲明下面。 Boos\utility 準(zhǔn)備了一個(gè)基類 noncopyable ,你只需要讓你的類繼承自 noncopyable 就可以獲得這個(gè)性質(zhì)。對(duì)你的類來(lái)說(shuō)這也是一個(gè)顯式的聲明:“我是不可以被復(fù)制的!”
            用法:

            #include? < boost / utility.hpp >

            class
            ?ResourceLadenFileSystem?:?boost::noncopyable?{


            5 .函數(shù)模板 addressof()

            函數(shù)模板返回一個(gè)對(duì)象的真實(shí)地址(當(dāng)然這是交給指針了):

            template < typename?T > inline?T * ????????????????addressof(T & ?v);
            template
            < typename?T > inline const ?T * ???????? addressof( const ?T &
            ?v);
            template
            < typename?T > inline volatile ?T * ????? addressof( volatile ?T &
            ?v);
            template
            < typename?T > inline const volatile T * ?addressof( const volatile T & v);

            我知道你想說(shuō),為什么不是簡(jiǎn)單的調(diào)用operator&()。因?yàn)?/span>c++允許重載operator&(),所以有時(shí)使用它獲得的并不是對(duì)象的真實(shí)地址,而是編寫重載operator&()代碼的作者希望給你的那個(gè)。如果你卻是希望獲得的是這個(gè)對(duì)象的地址,使用addressof():

            #include?<boost/utility.hpp>
            struct?useless_type?{};

            class
            ?nonaddressable?{
            ??useless_type?
            operator&()?const
            ;
            };

            void
            ?f()?{
            ??nonaddressable?x;
            ??nonaddressable
            *?xp?=
            ?boost::addressof(x);
            ??
            //?nonaddressable*?xpe?=?&x;?//
            error!?operator&()已經(jīng)被重載,
            ??????????????????????????????
            //它返回的是useless_type的指針
            }




            上述的所有東西都可以簡(jiǎn)單的通過(guò)在你的源文件開頭處寫上:
            #include?<boost\utility.hpp>
            using?namespace?boost;
            就可以使用了。當(dāng)然我是指你機(jī)器上已經(jīng)有boost這個(gè)奇妙的庫(kù),并且正確配置^_^
            posted on 2006-08-16 00:24 小山日志 閱讀(880) 評(píng)論(0)  編輯 收藏 引用 所屬分類: stl/boost/loki/generically
            午夜精品久久久内射近拍高清| 久久香蕉一级毛片| 波多野结衣久久精品| 欧美亚洲国产精品久久高清| 久久久久免费精品国产| 久久精品国产亚洲精品2020| 久久精品国产精品亚洲精品| 国产视频久久| 亚洲国产精品无码久久一区二区| 久久久久久亚洲AV无码专区| 99久久精品免费国产大片| 亚洲精品乱码久久久久久蜜桃| 少妇熟女久久综合网色欲| 国产精品久久久久久福利漫画| 国产精品日韩深夜福利久久| 99久久夜色精品国产网站| 精品久久久久久国产三级| 亚洲va久久久噜噜噜久久狠狠| 99久久久久| 2021精品国产综合久久| 久久丝袜精品中文字幕| 精品久久777| 久久人人妻人人爽人人爽| 久久人人超碰精品CAOPOREN | 久久伊人中文无码| 久久人人爽人人爽人人片AV不| 亚洲婷婷国产精品电影人久久| 久久这里只精品国产99热| 国产情侣久久久久aⅴ免费| 无码人妻久久一区二区三区蜜桃| 青青草原综合久久| 久久九九亚洲精品| 久久99国产精品二区不卡| 久久亚洲精品成人AV| 日韩人妻无码一区二区三区久久| 超级97碰碰碰碰久久久久最新| 久久91这里精品国产2020| 国产精品成人久久久久久久| 久久九九有精品国产23百花影院| 99国产欧美久久久精品蜜芽| 无码AV中文字幕久久专区|