这两个C++函数的区别

Difference of these two C++ functions

本文关键字:C++ 函数 区别 两个      更新时间:2023-10-16

考虑:

template<class T1, class T2>
class pair
{
    private:
        T1 a;
    public:
        T1 & first(){return a;}
        T1 first() const{return a;}
}

这两个"第一"函数之间有什么区别?它们什么时候使用?

这两个"第一"函数之间有什么区别?它们什么时候使用?

第一个(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

第一个返回对a的引用,第二个返回a的副本,并声明为const。这意味着,每当您有一个类为pair的对象时,如果该对象未声明为const,则将调用第一个对象,如果是,则调用第二个对象。

然而,IMHO的标准方法是使用它来避免复制:

T1 & first(){return a;}
const T1 & T1 first() const{return a;}

PS:你的代码中缺少一个分号。

第一个是返回引用,因此您可以直接访问a。如果您对返回值执行操作,那么您就是在对实例中的a执行操作。

代码气味,破坏封装。

第二个返回a副本。因为不能以这种方式更改实例内部的a,所以函数可以是const,即可以在类的常量实例上调用它(第一个函数不能调用它(。

我假设模板声明中的t1(sp!(是一个拼写错误,对吧?应为T1

带const的是一个返回a副本的const函数。第二个是非const函数,返回对a的引用。

如果通过常量引用将对传递给函数,则不能调用非常量版本。

T1 & first(){return a}

返回对T1类型的"a"对象的引用。更改返回的对象将更改从中返回的对象内部的对象。

T1 first() const{return a;}

返回"a"的副本。对返回的对象进行更改不会更改从中复制的对象。