您好,登錄后才能下訂單哦!
本篇內容介紹了“C++11中union的成員舉例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
類類型的union成員
C++的早期版本不允許union的成員是定義了構造函數或拷貝控制成員的類類型成員,C++11中取消了這個限制。但是也別高興得太早,因為這類union在發(fā)生涉及到類類型成員的值轉換時需要根據需求調用相關類成員的構造函數或析構函數。
假設我們有下面的StrValue類。引入這個類的目的是為了在對象操作時可以輸出日志信息。
代碼有點長,慢慢看。這個類主要用于存儲字符串。它包含3個構造函數,一個析構函數,一個賦值運算符。另外還重載了輸出運算符用于輸出內部的字符串。C++11以后,允許把這個類作為下面union的成員。
為union引入類類型成員后,帶來了一個麻煩:在切換union有效成員的時候需要恰當的調用類成員的構造函數和析構函數。例如下面的代碼:
最初有效的是ival成員,接下來希望存儲字符串時需要使用定位new方式調用構造函數;反之,當我們希望再次使用ival成員的時候,又需要調用sval成員的析構函數。如果不這樣做,就無法保證內存管理正常進行。
使用類管理union成員
解決上述問題的方法就是C++最基本的特征:封裝。我們可以將union封裝到另一個類中。
我們分類說明SmartUnion類的各個成員。
兩個數據成員,一個是用于保存類型信息的ut,通過這個成員,SmartUnion類可以判斷當前是哪個成員有效;另一個是包含整數和StrValue成員的匿名union,它是主角。
三個構造函數,一個默認構造函數,另外兩個分別接受整數和字符串輸入。注意這里的SmartUnion只是示例代碼,真正使用的時候可能還要添加不少內容,例如拷貝構造函數。
三個賦值運算符,分別提供從整數,StrValue對象和SmartUnion對象賦值的功能。
經過一番準備之后,用法就簡單了:
“C++11中union的成員舉例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。