• <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久久综合国产精品免费| 狠狠综合久久综合中文88 | 精品国产乱码久久久久久1区2区| 亚洲国产综合久久天堂| 亚洲中文字幕久久精品无码喷水| 久久久久久国产精品免费无码| 国产精品美女久久久久| 精品国产VA久久久久久久冰| 久久午夜羞羞影院免费观看| 久久国产午夜精品一区二区三区| 伊人久久大香线蕉亚洲五月天| 国产99久久久国产精品小说| 2021国产精品久久精品| 久久精品国产亚洲AV香蕉| 91精品国产高清久久久久久91 | 久久综合色老色| 久久99国产精品二区不卡| 欧美国产精品久久高清| 99久久久精品免费观看国产| 狠狠久久亚洲欧美专区| 精品熟女少妇aⅴ免费久久| 色99久久久久高潮综合影院| 国产韩国精品一区二区三区久久| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久久久亚洲精品男人的天堂| 亚洲伊人久久成综合人影院| 午夜精品久久久久久99热| 中文字幕无码av激情不卡久久 | 国产69精品久久久久观看软件| A级毛片无码久久精品免费| 国产高潮国产高潮久久久| 久久五月精品中文字幕| 人妻精品久久无码区| 99久久成人18免费网站| 无码精品久久一区二区三区| 久久久久高潮毛片免费全部播放| 狠狠精品久久久无码中文字幕 | 亚洲AV日韩精品久久久久| 国产69精品久久久久99尤物| 精品久久久久久久| 无码人妻少妇久久中文字幕|