1. 程式人生 > >【C++】學習筆記八——共用體

【C++】學習筆記八——共用體

共用體

共用體是一種資料格式,它能夠儲存不同的資料型別,但在同一時間只能儲存其中的一種型別。共用體的用途之一是,當資料使用兩種或更多種格式,但不會同時使用這些格式時,可以節省空間。

union one4all
{
    int int_val;
    long long_val;
    double double_val;
};

可以使用one4all變數來儲存int、long、double,條件是在不同的時間進行:

one4all pail;
pail.int_val = 15;
cout << pail.int_val;
pail.double_val = 1.38
; cout << pail.double_val;

pail有時可以是int變數,有時又可以是double變數。
由於共用體每次只能儲存一個值,因此他必須有足夠的空間來儲存最大的成員,所以,共用體的長度為其最大成員的長度。

假設管理一個小商品目錄,其中有一些商品的ID為整數,而另一些ID為字串,可以這樣做:

struct widget
{
    char brand[20];
    int type;
    union id
    {
        long id_num;
        char id_char[20];
    } id_val;
};
...
widget prize; ... if (prize.type == 1) cin >> prize.id_val.id_num; else cin >> prize.id_val.id_char;

匿名共用體(anonymous union)沒有名稱,其成員將成為位於相同地址處的變數。顯然,每次只有一個成員是當前成員:

struct widget
{
    char brand[20];
    int type;
    union
    {
        long id_num;
        char id_char[20];
    };
};
...
widget prize; ... if (prize.type == 1) cin >> prize.id_num; else cin >> prize.id_char;

此時由於共用體是匿名的,因此id_num和id_char被視為prize的兩個成員,他們的地址相同,所以不需要中間識別符號id_val。

共用體常用於(但並非只能用於)節省記憶體。

相關推薦

C++學習筆記——共用

共用體 共用體是一種資料格式,它能夠儲存不同的資料型別,但在同一時間只能儲存其中的一種型別。共用體的用途之一是,當資料使用兩種或更多種格式,但不會同時使用這些格式時,可以節省空間。 union one4all { int int_val;

C++學習筆記二十七——讀取數字的迴圈

  假設要將一系列數字讀入到陣列中,並允許使用者在陣列填滿之前結束輸入。一種方法是利用cin: int n; cin >> n;   如果使用者輸入一個單詞而不是數字,將發生: n的值保持不變; 不匹配的輸入將被保留在輸入佇列中; cin

C++學習筆記十三——陣列的替代品

陣列的替代品 陣列的替代品有模板類vector和array。 1. 模板類vector 模板類vector類似於string類,也是一種動態陣列。 可以在執行階段設定vector物件的長度,可在末尾附加新資料,還可在中間插入新資料。 vector是

C++學習筆記草稿版系列11(運算子過載)

運算子過載和友元之間是如何發生關係的 友元過載,成員過載 單目和雙目運算子可以過載 通常情況下: 雙目運算子過載為成員的話需要一個引數,過載為友元的話需要兩個引數 const Comple

C++11學習筆記返回型別後置語法

本次學習3個知識點: (1)auto推導型別 (2)decltype推導表示式的型別 (3)返回型別後置語法 泛型程式設計中經常遇到的寫一個加法函式: template <typename R, typename T, typename U>

C語言學習筆記printf,%n格式控制符中的異類?

printf的作用毫無疑問應該是用來輸出。但是其中卻出現了%n這個向記憶體寫入而不是輸出字元的控制符。 %n的功能實現原理,是有別於其他控制符,還是本質上和別的控制符相同,只是操作物件有區別。這有待進一步學習。 初步思考: 憑過去對組合語言的簡單瞭解,在螢幕上輸出的每一個字

C++11學習筆記型別判斷的type_traits學習

一、簡單的type_traits 我理解的type_traits是利用C++模板特性和static、enum特性定義編譯器常量,例如 //std::integral_constant原始碼 typelate<class T, T v> str

Python學習筆記十三:函數的參數對應

color 筆記 屏幕 *args borde 基於 但是 all small 位置傳遞 我們在定義函數時候已經對函數進行了參數傳遞調用,但是那只是粗淺的位置傳遞 示例 def sum(a,b,c): d = a+b+c return d p

Python學習筆記4-內置函數

打印數字 筆記 轉換 查看 判斷 lis clas 函數 ted 1、內置函數 1 print(all([1,2,3,0])) #判斷可叠代對象裏面是否都為真:非零即真非空即真原則 2 print(any([1,2,3,0])) #判斷可叠代對象裏面是否有一個為真:非

Python學習筆記4-time、md5、加密base64模塊

數據庫 sta 自己的 pri 時間 decode 不可 字符 ftime 1、time # 1、格式化好的時間 2018-1-14 16:42# 2、時間戳 是從unix元年到現在所有的秒數# 3、時間元組# 想時間戳和格式化好的時間互相轉換的話,都要先轉成時間元組,然後

Python學習筆記4-os、sys模塊

etc 創建 記錄 body spa platform pri eas usr 1、os操作系統模塊 1 import os 2 print(os.getcwd()) #獲取當前工作目錄 3 # print(os.chdir("..")) #更改當前目錄.當前目錄

Python學習筆記5-操作mysql數據庫pymysql

rod bsp phone utf8 charset delet 建立 包含 hone import pymysql#其他數據庫,比如oracle 模塊是pyoracle#1、鏈接數據庫mysq ip 端口號 密碼 賬戶 數據庫#2、建立遊標#3、執行sql#4、獲取結果#

Python學習筆記5-利用flask來mock接口

入口 輸出 端口號 delet app file log asc conf # 1、mock接口# import flask #python的輕量級的開發框架# # 接口,後臺服務的開發# # 在瀏覽器運行http://127.0.0.1:8080/get_user即可,或

python學習筆記10-ddt數據驅動

get args code imp content coo 文檔 AR ems DDT的使用 DDT包含類的裝飾器ddt和兩個方法裝飾器data(直接輸入測試數據),file_data(可以從json或者yaml中獲取測試數據) 只有yaml和yml結尾的文件以yaml形式

2018/09/07《塗抹MySQL》引擎學習筆記(四)

靈活 appears 優點 tables use 做什麽 null div 在線 讀   第七章《引擎》 總結 1:什麽是引擎?   - 就是一種數據存取和處理方式。   - 在 MySQL 中,引擎是以"插件式"存在的,使我們可以很方便的使用各種引擎。 2:怎麽查

Python學習筆記

數字型別 整數型別:沒有取值範圍限制 浮點數型別:浮點數精度受限,但精度很高,除科學計算外可視為不受限 複數型別:z = a + bj   實數部分:z.real  複數部分:z.imag

C++子函式返回結構的程式碼 及 字串常量傳入子函式的指標實現

說明: 1. 下面的子函式 getStu 裡,傳入了三個引數: 字串指標 char * name 整型變數 int k_year; char * k_sex; 2. 當把字串作為引數傳遞給子函式時,主程式中可以使用字串常量,但子函式的形參只能使用字元型指標 char

博弈論學習筆記

帝王為何殺功臣,大副如何謀位船長,傻B的另一種解釋…… 三姬分金 假設有A,B,C三個人,分100枚金幣。怎麼分呢?我們定一個規則,按順序提議,就是A先提議,B,再C,並且如果未超半數以上,不包括半數,同意提議,自己也有投票權。 前提假設: 三人很聰明,追求

httpClient學習筆記

HTTP 協議概述 HTTP–Hyper Text Transfer Protocol,超文字傳輸協議,是一種建立在TCP上的無狀態連線,整個基本的工作流程是客戶端傳送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理