C++中的位域(bit-filed):一种节省空间的成员
生活随笔
收集整理的這篇文章主要介紹了
C++中的位域(bit-filed):一种节省空间的成员
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有一種被稱為位域(bit-field) 的特殊的類數據成員,它可以被聲明用來存放特定數目的位。位域必須是有序數據類型。它可以有符號也可以無符號。例如:
class?File?{
//?
unsigned?int?modified?:?1;?//?位域?(bit-field)
};
class?File?{
public:
Bit?mode:?2;
Bit?modified:?1;
Bit?prot_owner:?3;
Bit?prot_group:?3;
Bit?prot_world:?3;
//?
};
{
modified?=?1;
//?
}
void?File::close()
{
if?(?modified?)
//??內容從略
}
int?main()?{
File?myFile;
myFile.mode?|=?READ;
if?(?myFile.mode?&?READ?)
cout?<<?"myFile.mode?is?set?to?READ\n";
}
inline?int?File::isWrite()?{?return?mode?&?WRITE;?}
if?(?myFile.isRead()?)?/**//*??*/
//?
unsigned?int?modified?:?1;?//?位域?(bit-field)
};
???
???位域標識符后面跟有一個冒號,然后是一個常量表達式指定位數。例如modified 是一個只有一位構成的位域。
???在類體中相鄰定義的位域,如果可能的話,它們會被放在同一個整數的連續位中,并以此提供空間壓縮。例如,在下列聲明中5 個位域被存儲在單個unsigned int 中,它首先與位域mode 相關聯。
class?File?{
public:
Bit?mode:?2;
Bit?modified:?1;
Bit?prot_owner:?3;
Bit?prot_group:?3;
Bit?prot_world:?3;
//?
};
???
???位域在內存中的位置是從低位向高位放置的,比如mode在Bit的最低兩位(二進制數0b0000000000000011中兩個1的位置)。
???對于位域的訪問方式與其他類數據成員相同。例如,類的私有位域只能在類的成員函數和友元中被訪問:
{
modified?=?1;
//?
}
void?File::close()
{
if?(?modified?)
//??內容從略
}
???
???下面的例子說明了怎樣使用大于1 位的位域
int?main()?{
File?myFile;
myFile.mode?|=?READ;
if?(?myFile.mode?&?READ?)
cout?<<?"myFile.mode?is?set?to?READ\n";
}
???
???通常情況下我們會定義一組inline 成員函數,來測試每個位域成員的值。例如,類File可以定義成員isRead()和isWrite()
inline?int?File::isWrite()?{?return?mode?&?WRITE;?}
if?(?myFile.isRead()?)?/**//*??*/
???有了這些成員函數,現在位域可以被聲明為類File 的私有成員。
???由于取地址操作符& 不能被應用在位域上,所以也沒有能指向類的位域的指針。位域也不能是類的靜態成員。
???C++標準庫提供了一個bitset 類模板,它可以輔助操縱位的集合。在可能的情況下應盡可能使用它來取代位域。
總結
以上是生活随笔為你收集整理的C++中的位域(bit-filed):一种节省空间的成员的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Oracle】PL/SQL 显式游标、
- 下一篇: FLP不可能性(FLP impossib