簡體   English   中英

C ++可變說明符

[英]C++ mutable specifier

什么時候可以,什么時候不能調用可變變量?

int / float / bool值非常清楚。 但是,比方說數組。 如果我要向其添加元素,可以將其稱為mutable數組嗎? std::vector相同。

再舉一個例子。 我有對象A,它保持對另一個對象B的引用(B&b)。對象B具有本機數組,我將重新分配/ std :: vector(在這種特殊情況下,我認為這是相似的)。 偽代碼:

struct B{
   std::vector<int> arr;
   // int *arr;              //Or this
   void changeArr(){
     arr.push_back(90);
   }
}

struct A{
   A(B &b) : b(b){};
   mutable B &b;     // is it ok to have it "mutable"?
   //mutable B b;    // or even this?
   void fire() const{
      b.arr.push_back(125);
      // Or 
      b.changeArr();
   }
}

我可以將B &b稱為可變嗎?


更新

根據http://en.cppreference.com/w/cpp/language/cv

可變-定義類的成員不影響該類的外部可見狀態。

externally visible state of the class什么? 當我增加數組大小,重新分配內容時會更改它嗎? 如果沒有,它什么時候發生變化?

讓我們舉兩個經典的例子說明可變的地方:

1.記住計算( 記憶

class prime_caclulator {
    private:
        mutable std::vector<int> m_primes;

    public:
        get(int n) const {
            // 1. If the nth prime is in m_primes, return it.
            // 2. Otherwise, calculate the nth prime.
            // 3. Store the nth prime in m_primes.
            // 4. Return that prime.
        }
};

在這里,我們有一個const函數get() ,無需更改此對象的內部狀態即可計算第n個素數。 但是,跟蹤先前計算的素數可能會有所幫助,以提高此對象的性能。

當調用get()時,此內部狀態(我們稱為m_primes )可能會更改,因此我們需要將其標記為可變的。 請注意,該對象的變化內容僅會更改此調用所花費的時間,而不是最終返回的內容。

2.線程安全

template <typename T>
class thread_safe_queue {
    private:
        mutable std::mutex m_mutex;
        std::queue<T> m_queue;

    public:
        size_t size() const {
            std::lock_guard<std::mutex> lock(m_mutex);
            return m_queue.size();
        }

        void push(T value) {
            std::lock_guard<std::mutex> lock(m_mutex);
            m_queue.push(value);
        }

        T pop() {
            std::lock_guard<std::mutex> lock(m_mutex);
            T top = m_queue.front();
            m_queue.pop();
            return top;
        }
};

在這種情況下,如果我們沒有可變的互斥體,那么我們將無法使size()為const,因為我們在該函數的過程中修改了m_mutex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM