• <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>
            小山日志
            讀書(shū),學(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í)地址,而是編寫(xiě)重載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ò)在你的源文件開(kāi)頭處寫(xiě)上:
            #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
            亚洲国产精品久久久久婷婷老年| 亚洲国产精品人久久| 久久国产免费直播| 国产精品99久久久久久董美香| 97久久精品人妻人人搡人人玩| 少妇内射兰兰久久| 国产综合久久久久| 久久综合欧美成人| 久久免费99精品国产自在现线| 狠狠色婷婷久久一区二区三区| 国产精品成人久久久| 一本一本久久A久久综合精品| 一本色道久久综合亚洲精品| 久久99国产乱子伦精品免费| 久久综合欧美成人| 亚洲&#228;v永久无码精品天堂久久 | 久久久久久狠狠丁香| 777久久精品一区二区三区无码| 人人狠狠综合久久亚洲88| 久久亚洲国产成人影院网站 | 久久久久久午夜精品| 久久国产色av免费看| 97精品国产91久久久久久| 国产成人久久777777| 久久热这里只有精品在线观看| 久久久精品2019免费观看| 国产精久久一区二区三区| 久久精品国产男包| 欧美亚洲另类久久综合| 国产精品99久久久精品无码| 91精品国产9l久久久久| 色偷偷88欧美精品久久久 | 大蕉久久伊人中文字幕| 思思久久精品在热线热| 伊人久久综在合线亚洲2019| 2020久久精品亚洲热综合一本| 精品久久久久久亚洲精品| 一级a性色生活片久久无| 国产精品成人99久久久久| 欧美熟妇另类久久久久久不卡| 久久精品国产一区二区电影|