了解&模板中的运算符

时间:2011-04-09 02:04:58

标签: c++

所以我现在正在阅读 sams自学C ++ ,我无法弄清楚何时以及为什么&运算符被使用,因为在许多情况下它似乎是不可取的:

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;  
};

请帮助我理解为什么&amp ;,我知道获取数据类型的地址,就在这里!它绝对没有让学习STL变得更容易..........感谢! =)

1 个答案:

答案 0 :(得分:8)

那不是运营商,也不是(直接)与模板相关。

它是一个类型修饰符,创建(或指示或表示或形成)引用,就像*创建指针一样。

很多时候,这是一种优化而非必需品。 Two 有必要的三种情况:

  • 在copy-constructor中,需要避免无限递归:

    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
    };
    

    一般来说,const引用除了必须复制一个大对象外,这是一个非常有用的优化,没有任何令人惊讶的行为。

  • 当函数的返回类型(尤其是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引用参数。

任何其他情况(例如输出参数)都可以(并且我认为应该)用指针处理,因为LOOKS类似值传递但更改其参数的函数调用违反了最小惊喜的原则。完美的例子: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