• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Shuffy

            不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19
            【轉】http://www.builder.com.cn/2004/0531/119655.shtml
            http://www.ieee.org.cn/dispbbs.asp?boardID=61&ID=43781
            關鍵字 mutable 是一個奇怪的修飾符(specifier),它只能夠用于一個類的非靜態數據成員。下面我將討論 mutable 的語義和用法,但是首先我要解釋一下 C++ 對象模型的一個關鍵概念
            對象的狀態

            一個對象的狀態由其非靜態數據成員的值構成,因此,修改一個數據成員將會改變整個對象的狀態。將一個成員函數聲明為 const 能夠保證它不會改變對象的狀態。

            然而在一些情況下,對象的邏輯狀態與基物理狀態之間可能有差別。例如,對于一個表示繪畫圖像的對象就存在這種情況。如果圖像還沒有更改,那么我們就認為其狀態沒有發生變化。然而,從底層實現方面來說,如果大對象在一段時間沒有活動,那么它們的內存通常會被交換到一個文件中。交換一個圖像并不會真地影響其狀態,但是對象的一些數據成員可能會發生變化,在這里可能會發生變化的是指針、標志位等。

            在用戶調用一個諸如 Redraw() 之類的 const 成員函數時,他們并不關心這個函數在內部是如何實現的。從他們的角度來說,這個函數并不改變對象的邏輯狀態,因此被聲明為 const。Redraw() 有可能修改對象的物理狀態這一事實是一個他們不應該關心的實現細節。例如:

            int Image::Redraw() const
            {
             if (isLoaded==false)
             {
              //..read image data from a disk into a local buffer
              isLoaded=true; //changing a data member's value
             }
              //..paint image in the screen
            }

            class Image

            可變(mutable)數據成員

            如果嘗試編譯這段代碼,你會得到一個編譯錯誤。雖然 Redraw() 聲明為 const,但是它修改了一個數據成員。解決這個編譯錯誤的方法是將 isLoaded 聲明為一個 mutable 數據成員:

            class Image
            {
            public:
             int Redraw() const;
             //..
            private:
             mutable bool isLoaded;//can be changed by a const function
            };

            不像普通的數據成員,const 成員函數可以修改 mutable 數據成員。

            Mutable 數據成員的使用看上去像是騙術,因為它能夠使 const 函數修改對象的數據成員。然而,明智地使用 mutable 關鍵字可以提高代碼質量,因為它能夠讓你向用戶隱藏實現細節,而無須使用不確定的東西,比如 const_cast<>。



            具體一些的例子:

            mutable的作用是用來修飾類的成員變量,使這個成員變量的值在任何情況下都可以被修改,例如:

            為敘述方便,預定義一個類TObject,如下:

            class TObject
            {
              int iValue;
            };

            情況1:

            我們知道,若TObject中存在一個成員函數,并且次函數的聲明末尾加上了const關鍵字,形式如下:

            void setValue(int) const;  // 注:有些地方把這種函數稱為常函數。

            那么這就意味著,這個函數的實現中不能修改該類的成員變量的值,但是,倘若我們要記錄這個函數調用的次數,我們會有很多方法,如間接調用該函數,但是這顯然不是一個好方法,這會增加類的復雜度。這個時候mutable就派上用場了,它可以使被修飾的成員變量在該種情況下被改變,你可以這樣書寫代碼:

            class TObject
            {
              mutable int iValue;
            public:
              void setValue(int pValue) const
              {
                iValue++;
              }
            };

            當然,這并不是一個好例子,因為它沒有多少實用價值,我的目的在于說明問題。

            情況2:

            若有一個TObject的實例被定義為常量,如:

            const TObject tObject; // 注:有些地方將之稱為常對象。

            如果沒有mutable的話,這顯然意味著你將無法修改該對象,那么,如果你只希望關閉掉部分成員變量的修改權,那么你就應該像情況1那么書寫代碼,讓你調用setValue成員函數時仍能修改iValue的值。

            久久伊人色| 久久福利青草精品资源站免费 | 国内精品伊人久久久久妇| 日韩欧美亚洲综合久久影院Ds| 欧美大战日韩91综合一区婷婷久久青草 | 久久久久人妻一区精品| 亚洲欧美成人综合久久久 | 日本加勒比久久精品| 色综合久久久久综合体桃花网| 精品国产福利久久久| 亚洲七七久久精品中文国产 | 亚洲va久久久噜噜噜久久| 国产精品久久久久…| 久久久SS麻豆欧美国产日韩| 久久99久久成人免费播放| 亚洲精品蜜桃久久久久久| 久久久久久久久久免免费精品| 欧美黑人激情性久久| 色婷婷久久综合中文久久一本| 久久99国产精一区二区三区| 久久久久久久波多野结衣高潮| 久久国产成人精品国产成人亚洲| 香蕉久久夜色精品升级完成| 要久久爱在线免费观看| 99久久国产免费福利| 久久91精品国产91久久小草| 狠狠精品久久久无码中文字幕 | 一本一道久久精品综合| 2021久久精品国产99国产精品| 亚洲欧美日韩久久精品第一区| 香港aa三级久久三级老师2021国产三级精品三级在| 久久精品国产清高在天天线| 欧美午夜精品久久久久免费视| 日本欧美久久久久免费播放网| 香蕉久久夜色精品国产2020| 亚洲性久久久影院| 亚洲人AV永久一区二区三区久久 | 国产精品一久久香蕉国产线看| 亚洲色婷婷综合久久| 久久久久久夜精品精品免费啦| 久久综合久久自在自线精品自 |