在類(lèi)內(nèi)部其實(shí)是可以定義一些類(lèi)型的,比如struct、union、class,其實(shí)也就只有這三類(lèi)可以被定義,
也只有這三類(lèi)可以定義它們各自的對(duì)象,然后“.”出來(lái)或者“->”出來(lái),C++中只有這三類(lèi)了。
對(duì)于它們各自來(lái)說(shuō),在一個(gè)類(lèi)的內(nèi)部都可以有三種方式來(lái)定義它們,比如對(duì)于union,
第一種方式://定義了一個(gè)union類(lèi)型,并且定義了一個(gè)屬于該類(lèi)型的對(duì)象un,因此sizeof(X)==4
class X{
public:
union UN{
int m_nX;
char* pchar;
}un;
};
第二種方式://定義了一個(gè)union類(lèi)型,但并沒(méi)有定義屬于該類(lèi)型的任何對(duì)象,因此sizeof(X)==0
class X{
public:
union UN{
int m_nX;
char* pchar;
};
};
第三種方式://定義了一個(gè)匿名的union類(lèi)型,因此也就只能在X內(nèi)部使用了,并且此種情況隱含著已經(jīng)
在X中定義了一個(gè)屬于該匿名union類(lèi)型的對(duì)象,因此sizeof(X)==4,并且此種情況最為特殊,可以直接
通過(guò)類(lèi)X的對(duì)象來(lái)使用m_nX和pchar,例如X x;x.m_nX=10;x.pchar="Hello World!";
class X{
public:
union {
int m_nX;
char* pchar;
};
};
對(duì)于前兩種方式,都在類(lèi)的內(nèi)部定義了一個(gè)新的具有名字的型別,因此可以用這種新的類(lèi)型來(lái)定義對(duì)應(yīng)
于該類(lèi)型的對(duì)象,例如:X::UN myun;但是這種定義是要求類(lèi)內(nèi)部的union在定義時(shí)的修飾符為public,
否則就不能在類(lèi)外部定義屬于他們的對(duì)象,而只能在給類(lèi)X內(nèi)部使用了。
同理也可以知道在類(lèi)內(nèi)部通過(guò)typedef定義出來(lái)的新型別也是如此。
需要說(shuō)明的是,union用類(lèi)里以第三種定義的方式出現(xiàn)的話(huà),會(huì)有很奇妙的效果,非常奇妙,或許在今
后的編程過(guò)程中可以加以利用。m_nX和pchar共享一塊4個(gè)字節(jié)的內(nèi)存,只要不是同時(shí)需要m_nX和pchar
出現(xiàn)的情況都可以只利用它們其中的一個(gè),從而節(jié)省了內(nèi)存開(kāi)銷(xiāo)。