1. 程式人生 > >C++11新特性(85)-類型別的union成員(1)

C++11新特性(85)-類型別的union成員(1)

接下來的兩篇文章介紹C++11的最後一個新特性:類型別的union成員。這個新特性涉及的內容較多,所以本文先做一些不屬於C++11新特性的準備工作。

 

匿名union

我們通過一個例子類說明。假設有以下函式:

這 個函式的功能是根據引數rt的要求產生隨機數並轉換為字串。程式碼中首先為每一種場景準備了一個臨時變數用於儲存隨機數生成器的輸出。但是觀察接下來的代 碼我們發現這兩個變數並不會同時使用,所以希望能優化一下。一個方法就是將變數定義移到switch分支內;另一個方法就是將這兩個變數結合在一起定義一 個union。

 

但是這樣做有點麻煩:一個是要為union起名字,另一個是要修改使用union成員的程式碼。解決這個問題的方法就是本節的標題:匿名union。程式碼修改如下:

唯一的變化就是聲明瞭一個沒有名字的union。C++規定,位於匿名union所在作用域內的程式碼可以直接使用匿名union的成員。兩個麻煩一次解決!

 

直接呼叫建構函式和解構函式

一 般來講,建構函式/解構函式是物件被構造和銷燬時自動執行,不需要程式設計師顯示呼叫。其原因就是絕大多數情況下,申請記憶體/構造物件和析構物件/釋放記憶體都 是打包執行的。但是在某種情況下希望將記憶體操作和物件操作分離,這時就需要需要對已經準備好的記憶體空間呼叫類的建構函式,同時希望呼叫解構函式後可以不釋 放記憶體。示例程式碼如下:

IntValue是特別簡單的類示例,只包含一個整數成員以及構造/解構函式。

 

testConstDest首先使用allocator分配一塊未構造的記憶體,然後在第三行鍼對pv指向的記憶體呼叫建構函式,生成的物件儲存在指標piv中。

 

testConstDest第五行對piv顯示呼叫解構函式後,利用allocator釋放記憶體。

 

這裡需要注意第三行,第五行的用法。詳細資訊可以參照C++ Primer(第五版)的19.1.2節:定位new表示式。

 

作者一句話

雖然不是新內容,但是一樣很重要。

 

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】