所以我现在正在阅读 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变得更容易..........感谢! =)
答案 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_ptr
或unique_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