2011-04-09 211 views
2

這樣的IM正在閱讀將由Sams C++,但無法弄清楚何時以及爲什麼&運營商使用,因爲它似乎像它會在許多情況下,像這樣uneccesary:瞭解在模板中與運營商

template <typename objectType> 
objectType & GetMax (const objectType & value1, const objectType & value2)  
{ 
    if (value1 > value2) 
     return value1;  
    else 
     return value2; 
}; 

又如:

Template <typename T> 
class myTemplateClass 
{ 
public: 
    void SetVariable (T& newValue) {m_Value = newValue; }; 

    T& GetValue() {return m_Value;}; 

private: 
    T m_Value; 
}; 

請幫助我瞭解爲什麼&,我知道獲取數據類型的地址,就在這裏!它絕對不會讓學習STL更容易..........謝謝! =)

+0

令人困惑的是,這是不一樣的 - 你知道它得到的地址的一個對象。這是完全不同的用途。 – 2011-04-09 09:34:49

+0

你需要一本關於C++的好書...並且不要花時間在模板中,至少等到你知道什麼是引用。 – 2011-04-09 09:50:14

回答

8

這不是一個運算符,它不與模板(直接)相關。

它是一個類型修飾符,創建(或指示或表示或形成)引用,就像*創建一個指針。

大部分時間,這是一個優化而不是必需。 兩個 三種情況下有必要:

  • 在拷貝構造函數,它需要避免無限遞歸:

    class X 
    { 
        //X(X); 
        // pass by value, the formal parameter is a copy of the actual parameter 
        // the copy constructor must be called to make the copy 
    
        X(const X&); // pass by reference, ok, no copy constructor call necessary 
    }; 
    

    一般常量引用保存不必複製大對象,是一個有用的優化,沒有令人吃驚的行爲。

  • 當返回類型的函數,尤其是operator[]過載,必須出現在表達式的左側:

    class Container 
    { 
        //Element operator[](int index); 
        // problematic because c[i] is a temporary 
        // so c[i] = 5; doesn't actually modify the collection, like it would with an array 
    
        Element& operator[](int index); // correct 
    

    };

    作爲一種類似的情況,對於左操作數發生變異的運算符(如複合賦值和流插入),必須使用非const引用參數。

任何其他情況下(如輸出參數)可以(而且我認爲應該)用指針來處理,因爲一個函數調用,看起來像傳遞的價值,但改變其參數違反原則最小驚喜。完美的例子:auto_ptr<int> a = new int(5); f(a); /* is a still valid !?! */

這給我們帶來病例3,(創建,因爲有人使用運營商之外的非const引用):

  • 在模板中,當由auto_ptrunique_ptr,一個實際的類型可能需要參考,以避免推斷型,破壞原:

    auto_ptr<int> a = new int(5); 
    
    //template<typename T> 
    //void dump_target(T handle) { cout << *item; } 
    // bad: dump_target(a); destroys *a 
    
    template<typename T> 
    void dump_target(const T& handle) { cout << *item; } // correct 
    
+2

s /創建/表示 – 2011-04-09 02:12:02

+1

有2種情況? – Mehrdad 2011-04-09 02:13:50