Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这两个C++;功能_C++_Function - Fatal编程技术网

C++ 这两个C++;功能

C++ 这两个C++;功能,c++,function,C++,Function,考虑: template<class T1, class T2> class pair { private: T1 a; public: T1 & first(){return a;} T1 first() const{return a;} } 模板 类对 { 私人: T1α; 公众: T1&first(){return a;} T1 first()常量{return a;} } 这两个“第一”函数有什么区

考虑:

template<class T1, class T2>
class pair
{
    private:
        T1 a;

    public:
        T1 & first(){return a;}
        T1 first() const{return a;}
}
模板
类对
{
私人:
T1α;
公众:
T1&first(){return a;}
T1 first()常量{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
x对;
常数对y;
x、 第一个();//T1&first()
y、 第一个();//T1第一个()常数
这两个“第一”函数有什么区别?什么时候使用

第一个(
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
x对;
常数对y;
x、 第一个();//T1&first()
y、 第一个();//T1第一个()常数

带有const的函数是一个const函数,它返回。第二个是非常量,返回对a的引用


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

带有常量的是一个常量函数,它返回一个。第二个是非常量,返回对a的引用


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

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

代码气味,破坏封装

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


我假设模板声明中的
t1
(sp!)是一个打字错误,对吗?应该是
T1

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

代码气味,破坏封装

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


我假设模板声明中的
t1
(sp!)是一个打字错误,对吗?应该是
T1

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

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

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

PS:代码中缺少分号。

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

T1 & first(){return a}
然而,IMHO的标准方法是使用此方法来避免复制:

T1 & first(){return a;}
const T1 & T1 first() const{return a;}
PS:您的代码中缺少分号

T1 & first(){return a}
返回对T1类型的“a”对象的引用。更改返回的对象将更改从中返回的对象内部的对象

T1 first() const{return a;}
返回“a”的副本。对返回的对象进行更改不会更改该对象的复制源

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

T1 first() const{return a;}

返回“a”的副本。对返回的对象进行更改不会更改它所复制的对象。

我觉得有点令人不安,不仅我是唯一一个指出返回对成员的引用可能不是最明智的做法的人,而且答案实际上鼓励了这种行为,甚至连警告都没有被选为“正确”。返回对成员的引用(在
first()
中)是否是一种好的做法取决于用例。然而,在
second()。如果您发现
second()
有问题,请告诉我。没有具体问题,尤其是在
const
案例中。但我看到过太多的初学者不惜一切代价试图“避免复制”,却完全忽略了封装、局部性等问题。当性能甚至不是一个问题时,我对“让它存在”有点过敏,而没有明确说明这不是OO的意义。;-)我感到有些不安的是,不仅我是唯一一个指出返回对成员的引用可能不是最明智的做法的人,而且答案实际上鼓励了这种行为,而没有任何警告被选为“正确”。返回对成员的引用(在
first()
中)是否是一种良好的做法取决于用例。然而,在
second()。如果您发现
second()
有问题,请告诉我。没有具体问题,尤其是在
const
案例中。但我见过太多的初学者试图不惜一切代价“避免复制”,却完全忽略了封装、局部性等