考虑:
template<class T1, class T2>
class pair
{
private:
T1 a;
public:
T1 & first(){return a;}
T1 first() const{return a;}
}
这两个&#34;第一个&#34;之间的区别是什么?功能?他们什么时候使用?
答案 0 :(得分:4)
这两个“第一”功能有什么区别?什么时候使用?
当对象T1 first() const
合格时,将调用第一个(const
),当对象返回时,将返回a
,另一个(T1 & first()
)的副本没有const
限定,并会返回对a
的引用。
举个例子:
pair<int, int> x;
const pair<int, int> y;
x.first(); // T1 & first()
y.first(); // T1 first() const
答案 1 :(得分:3)
第一个返回对a
的引用,第二个返回a
的副本并声明为const
。这意味着,只要你有一个类pair
的对象,如果没有声明对象const
,则会调用第一个,如果没有,则调用第二个。
然而,恕我直言的标准方式是使用它来避免复制:
T1 & first(){return a;}
const T1 & T1 first() const{return a;}
PS:你的代码中缺少一个分号。
答案 2 :(得分:1)
第一个是返回引用,因此您可以直接访问a
。如果您对返回值执行操作,则您将对实例中的a
采取行动。
代码味道,打破封装。
第二个返回a
的副本。因为你无法改变实例中的a
,所以函数可以是const
,即你可以在类的常量实例上调用它(你不能用第一个函数)。
我假设模板声明中的t1
(sp!)是拼写错误,对吧?应该是T1
。
答案 3 :(得分:0)
带const的那个是const函数,它返回一个a的副本。第二个是非const,并返回对。
的引用如果通过const引用将对传递给函数,则无法调用非const版本。
答案 4 :(得分:0)
T1 & first(){return a}
返回对T1类型的'a'对象的引用。更改返回的对象将更改从其返回的对象内的对象。
T1 first() const{return a;}
返回'a'的副本。对返回的对象进行更改不会更改从中复制的对象。