C++中的struct專(zhuān)題研究

字號(hào):

C++之父Bjarn Stroustrup對(duì)C++語(yǔ)言概括的第一條就是"a better C"。struct這個(gè)關(guān)鍵字就來(lái)源于C。而在C++中,struct的含義已經(jīng)和C中的struct不盡相同了。在C++中,用戶(hù)定義類(lèi)型,也就是class,擁有和內(nèi)建類(lèi)型一樣的地位。這可以從C++中struct定義的類(lèi)型在聲明變量時(shí)不必再寫(xiě)出struct關(guān)鍵字看出。如
    struct Foo {
    // ...
    };
    Foo f;
    在C++程序中,人們似乎更熱衷于使用class,而幾乎忽略了struct的存在。實(shí)際上,struct就是成員默認(rèn)為public的class(在class中,成員默認(rèn)為private)。事實(shí)上以下兩端代碼完全等價(jià):
    代碼一:
    struct Foo {
    // ...
    };
    代碼二:
    class Foo {
    public:
    // ...
    };
    那么為什么要有struct的存在呢?首先的原因自然是保持對(duì)C的兼容。原先的C代碼可以不必修改就成為合法的C++代碼。第二個(gè)原因(個(gè)人愚見(jiàn)),是為了讓struct來(lái)表示抽象的數(shù)據(jù)類(lèi)型以及抽象接口,而與class所表示的類(lèi)的概念相區(qū)別。
    struct在C中的使用方式轉(zhuǎn)移到C++以后仍然是非常重要,作為一組相關(guān)的數(shù)據(jù)而存在于一個(gè)struct,說(shuō)明了他們?cè)谶壿嬌鲜窍嗷リP(guān)聯(lián)的數(shù)據(jù),同時(shí)他們被保存在struct里而不是全局變量,也是對(duì)數(shù)據(jù)的一種管理。個(gè)人認(rèn)為一種很樸素的用法要取代當(dāng)前很熱門(mén)的get-set用法。比如
    class Foo {
    int bar;
    public:
    int get_bar() { return bar; }
    void set_bar(const int& b) { bar = b; }
    };
    這里Foo::bar是一個(gè)需要頻繁存取的數(shù)據(jù)對(duì)象,它作為類(lèi)Foo的私有成員存在,而通過(guò)公共接口存取。這是面向?qū)ο笏枷胫袛?shù)據(jù)封裝的體現(xiàn)。而考慮一下這個(gè)Foo::bar是否有必要成為私有成員?沒(méi)有,因?yàn)樗褪且粋€(gè)數(shù)據(jù),沒(méi)有必要用私有類(lèi)成員的思想來(lái)封裝它,似乎可以看成是面向?qū)ο笏枷氲倪^(guò)度濫用。等效的可以寫(xiě)成:
    struct Foo {
    int bar;
    };
    然后通過(guò)普通的賦值操作來(lái)完成。這樣做似乎是回到了原始時(shí)代,但沒(méi)有必要用的就不要用,否則還會(huì)影響效率。 其次一個(gè)struct的應(yīng)用就是來(lái)描述純虛類(lèi),也就是后來(lái)Java語(yǔ)言中類(lèi)似接口的東西:
    struct Foo {
    virtual void Bar1() = 0;
    virtual void Bar2() = 0;
    // ...
    };
    使用struct可以些許節(jié)省編譯器的語(yǔ)法分析時(shí)間:),而且能在語(yǔ)義上表達(dá)的更為清楚。
    一般來(lái)講,當(dāng)一個(gè)類(lèi)中有必要進(jìn)行數(shù)據(jù)隱藏時(shí),請(qǐng)用class聲明,并將私有數(shù)據(jù)標(biāo)記為private,公共接口標(biāo)記為public;而當(dāng)所有成員都有必要成為公有成員的時(shí)候,請(qǐng)用struct來(lái)聲明它。