• <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>

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            C++ notes (5)

            41、vector、list、deque的性能初窺

            int large_size = 10000000;
            
            cout_current_time("start init vector!\t");
            vector<string> svec1(large_size, "Hello");
            vector<string> svec2(large_size, "Hi");
            cout_current_time("end init vector!\t");
            
            cout_current_time("start init list!\t");
            list<string> slist1(large_size, "Hello");
            list<string> slist2(large_size, "Hi");
            cout_current_time("end init list!\t");
            
            cout_current_time("start init deque!\t");
            deque<string> sdeq1(large_size, "Hello");
            deque<string> sdeq2(large_size, "Hi");
            cout_current_time("end init deque!\t");

            用事實(shí)說話最有說服力:

            start init vector!    current time : 5:5:52
            end init vector!    current time : 5:5:55
            start init list!    current time : 5:5:55
            end init list!    current time : 5:6:14
            start init deque!    current time : 5:6:14
            end init deque!    current time : 5:6:26

            可以看出大致時(shí)間比例為3/19/12。雖然不足以佐證它們的性能差距,但vector的常用似乎有了更充分的理由。

            這里使用了一個(gè)簡單的時(shí)間函數(shù)大致如下:

            #include <time.h>
            
            typedef struct
            tm * time_type; time_type get_current_time(void) { time_t t; t = time(NULL); return localtime(&t); }

            42、容器自增長(P286)

            每種實(shí)現(xiàn)都要求遵循以下原則:確保push_back操作高效地在vector中添加元素。從技術(shù)上來說,在原來為空的vector容器上n次調(diào)用push_back函數(shù),從而創(chuàng)建擁有n個(gè)元素的vector容器,其執(zhí)行時(shí)間永遠(yuǎn)不能超過n的常量倍。

            43、類定義中為何不能具有自身的數(shù)據(jù)成員(P375)

            因?yàn)橹挥挟?dāng)類定義體完成后才能定義類,因此類不能具有自身類型的數(shù)據(jù)成員。然而,只要類名一出現(xiàn)就可以認(rèn)為該類已聲明。因此,類的數(shù)據(jù)成員可以是指向自身類型的指針或引用:

            class LinkScreen {

            Screen window;

            LinkScreen *next;

            LinkScreen *prev;

            };

            44、兩種引用類類型的方法(P376)

            Sales_item item1; //default initialized object of type Sales_item

            class Sales_item item1; //equivalent definition of item1

            兩種引用類類型的方法是等價(jià)的。第二種方法是從C繼承而來的,在C++中仍然有效。第一種更為簡練,由C++語言引入,使得類類型更容易使用。

            45、為什么類的定義以分號結(jié)束(P376)

            分號是必須的,因?yàn)樵陬惗x之后可以接一個(gè)對象定義列表。定義必須以分號結(jié)束:

            class Sales_item {/* … */};

            class Sales_item {/* … */} accum, trans;

            46、形參表和函數(shù)體處于類作用域中,函數(shù)返回類型不一定在類作用域中

            在定義于類外部的成員函數(shù)中,形參表和成員函數(shù)體都出現(xiàn)在成員名之后。這些都是在類作用域中定義,所以可以不用限定而引用其他成員。因?yàn)樾螀⒈硎窃赟creen類作用域內(nèi),所以不必知名我們想要的是Screen::index。

            如果返回類型使用由類定義的類型,則必須使用完全限定名。

            #include "stdafx.h"
            #include <iostream>
            
            class MyClass
            {
            public :
                typedef int index_t;
                index_t twice(index_t in);
            };
            
            MyClass::index_t MyClass ::twice(index_t in)
            {
                return in * 2;
            }
            
            int _tmain(int argc, _TCHAR* argv[])
            {
                using namespace std; 
                
                MyClass obj;
                MyClass::index_t x, y;
                
                x = 10;
                y = obj.twice(x);
            
                cout<<"x = "<<x<<"; y = "<<y<<";"<<endl;
            
                return 0;
            }

            47、構(gòu)造函數(shù)初始化式(P387)

            與任意的成員函數(shù)一樣,構(gòu)造函數(shù)可以定義在類的內(nèi)部或外部。構(gòu)造函數(shù)初始化式只在構(gòu)造函數(shù)的定義中而不是聲明中指定。

            構(gòu)造函數(shù)初始化列表難以理解的一個(gè)原因在于,省略初始化列表并在構(gòu)造函數(shù)的函數(shù)體內(nèi)對數(shù)據(jù)成員賦值是合法的。

            在構(gòu)造函數(shù)初始化列表中沒有顯式提及的每個(gè)成員,使用與初始化變量相同的規(guī)則來進(jìn)行初始化。運(yùn)行該類型的默認(rèn)構(gòu)造函數(shù),來初始化類類型的數(shù)據(jù)成員。內(nèi)置或復(fù)合類型的成員的初始值依賴于對象的作用域:在局部作用域中這些成員不被初始化,而在全局作用域中它們被初始化為0。

            如果那個(gè)類沒有默認(rèn)構(gòu)造函數(shù),則編譯器嘗試使用默認(rèn)構(gòu)造函數(shù)將會(huì)失敗。在這種情況下,為了初始化數(shù)據(jù)成員,必須提供初始化式。

            對于這樣的成員,在構(gòu)造函數(shù)函數(shù)體中對它們賦值不起作用。沒有默認(rèn)構(gòu)造函數(shù)的類類型成員,以及const或引用類型的成員,不管是哪種類型,都必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化。

            因?yàn)閮?nèi)置類型的成員不進(jìn)行隱式初始化,所以對這些成員是進(jìn)行初始化還是賦值似乎都無關(guān)緊要。除了兩個(gè)例外,對非類類型的數(shù)據(jù)成員進(jìn)行賦值或使用初始化式在結(jié)果和性能上都是等價(jià)的。

            48、成員初始化的次序

            構(gòu)造函數(shù)初始化列表僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員被初始化的次序就是定義成員的次序。

            class X{

            int i;

            int j;

            public:

            //run-time error: i is initialized before j

            X(int val): j(val), i(j) {}

            }

            在這種情況下,構(gòu)造函數(shù)初始化列表看起來似乎是用val初始化j,然后再用j來初始化i。然而i首先被初始化。這個(gè)初始化列表的效果是用尚未初始化的j值來初始化i!

            49、使用默認(rèn)構(gòu)造函數(shù)(P393)

            常犯的一個(gè)錯(cuò)誤是采用以下方式聲明一個(gè)用默認(rèn)構(gòu)造函數(shù)初始化的對象:

            Sales_item myobj();

            Sales_item myobj(); //ok: but defines a function, not an object

            if(myobj.same_isbn(Primer_3rd_ed)) // error: myobj is a function

            正確的方式應(yīng)該是去掉相應(yīng)的括號:

            Sales_item myobj;

            或者

            Sales_item myobj = Sales_item();

            50、顯式或隱式初始化

            #include "stdafx.h"
            #include <iostream>
            using namespace std; 
            class MyClass
            {
            public :
                typedef int index_t;
                bool same_object(MyClass obj);
            
            public :
                MyClass(int default_index = 5)
                    :default_index(default_index),
                    m_name("default_name"){}
                MyClass::MyClass(std::string name);
            
            public :
                int default_index;
                std::string m_name;
            };
            
            MyClass::MyClass(std::string name)
                    :default_index(0), m_name(name){}
            
            bool MyClass::same_object(MyClass obj)
            {
                cout<<"m_name = "<<m_name.c_str()<<endl;
                cout<<"obj.m_name = "<<obj.m_name.c_str()<<endl;
                return strcmp(obj.m_name.c_str(), m_name.c_str()) == 0;
            }
            
            int _tmain(int argc, _TCHAR* argv[])
            {    
                MyClass obj;
            
                cout<<"explicit : "<<obj.same_object(MyClass("default_name"))<<endl;
                cout<<"implicit : "<<obj.same_object(string("default_name"))<<endl;
            
                return 0;
            }

            因?yàn)榫哂幸詓td::string為形參的構(gòu)造函數(shù),因此在調(diào)用需要MyClass對象的same_object成員函數(shù)時(shí),會(huì)自動(dòng)隱式調(diào)用該構(gòu)造函數(shù)構(gòu)建MyClass對象,用于操作。但生成的MyClass對象是臨時(shí)對象,在same_object函數(shù)調(diào)用完成后銷毀。如果為了避免產(chǎn)生隱式轉(zhuǎn)換可以使用explicit關(guān)鍵字來抑制由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換:

            explicit

            posted on 2009-02-12 01:06 volnet 閱讀(1213) 評論(0)  編輯 收藏 引用 所屬分類: C++ Primer 學(xué)習(xí)筆記

            特殊功能
             
            久久99精品九九九久久婷婷| 一级做a爰片久久毛片看看| 久久热这里只有精品在线观看| 热久久国产精品| 伊人久久综合无码成人网| 久久99久久99精品免视看动漫| 久久电影网2021| 久久亚洲欧洲国产综合| 午夜欧美精品久久久久久久| 欧美国产成人久久精品| 久久精品国产清高在天天线| 久久这里只精品国产99热| 久久久久亚洲AV综合波多野结衣 | 人人狠狠综合久久亚洲88| 精品久久久久久无码人妻蜜桃| 久久久久高潮综合影院| 欧美久久精品一级c片片| 久久久久亚洲AV成人网人人网站| 精品久久久久久中文字幕人妻最新| 久久久九九有精品国产| 亚洲伊人久久精品影院| 久久精品国产精品亚洲| 99久久久精品免费观看国产| 久久伊人亚洲AV无码网站| 久久中文字幕一区二区| 亚洲AV成人无码久久精品老人| 久久国产精品免费一区二区三区| 久久久免费精品re6| 久久婷婷是五月综合色狠狠| 久久综合狠狠综合久久激情 | 欧美喷潮久久久XXXXx| 久久免费99精品国产自在现线 | 国内精品久久久久久野外| 国内高清久久久久久| 久久99这里只有精品国产| 久久99精品久久久久久野外 | 国产精品女同久久久久电影院 | 国产成年无码久久久久毛片| 亚洲综合伊人久久大杳蕉| 久久人人爽人人爽人人片AV麻烦| 久久久久人妻一区精品果冻|