这两个C++函数的区别
Difference of these two C++ functions
考虑:
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"的副本。对返回的对象进行更改不会更改从中复制的对象。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗