引用运算符的使用和从 c++ 中的函数返回
Use of reference operator & in returning from function in c++
我在代码中感到困惑:
#include <iostream>
#include <ctime>
using namespace std;
double vals[] = { 10.1, 12.6, 33.1, 24.1, 50.0 };
double& setValues(int i)//if i remove the &operator, i get an error, why ?
{
return vals[i]; // return a reference to the ith element
}
int main()
{
cout << "Value before change" << endl;
for (int i = 0; i < 5; i++)
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
setValues(1) = 20.23; // change 2nd element
setValues(3) = 70.8; // change 4th element
cout << "Value after change" << endl;
for (int i = 0; i < 5; i++)
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}
如果我删除函数中的 & 运算符
double& setValues(int i);
我收到错误为"需要 L 值作为赋值的左操作数"这是否意味着值 vals[i] 应该放在正确的位置?和 &运算符 这部分变成 L 值 ?
当您创建变量或数组并为其命名时,它们会留出一个内存区域供它们位于其中。
double vals[] = { 10.1, 12.6, 33.1, 24.1, 50.0 };
该数组的每个元素都有一个不同的内存地址。
没有 &
引用声明符的函数将只返回数组中值的副本:
double setValues(int i); // return a copy of a value from the array
这个副本的问题在于它没有被赋予一个永久的记忆生活的地方。这就是我们所说的临时价值,它只存在于创建它的表达式中。表达式结束后,临时值将被销毁。
所以:
double d = setValue(3); // okay
尽管函数名称不是很合适,但编译器允许这样做,因为在临时销毁之前,数组中值的临时副本存储在称为d
的永久(ish)位置。
因此,允许创建临时变量的表达式存在于赋值的右侧非常有用,其中赋值的左侧可以捕获其值。
但反之则不然:
setValue(3) = 70.8; // not allowed
原因是setValue(3)
返回数组中值的临时副本,该副本将在赋值后立即销毁。因此,如果之后将立即删除此类临时值的值,则允许写入该值是没有意义的。
此外,如果编译器允许对此类临时进行赋值,则必须为其留出实际内存(而不仅仅是CPU寄存器),并且编译器将失去更有效地处理临时的机会。
当您使用引用声明符更改函数以返回引用时,所有更改:
double& setValues(int i); // return access to the value in the array
返回的是对数组本身中实际值的访问。这不是一个临时值,而是驻留在主内存中的永久值。
因此,现在编译器允许您更改其值是有意义的,因为它不会在表达式结束后被销毁,但它将继续存在,直到数组本身被销毁。
setValue(3) = 70.8; // now it is good - changes the array itself
这是否意味着值 vals[i] 应该放在正确的位置?
不。 vals[i]
既可以是赋值运算符的左操作数,也可以是右操作数。它是从函数返回double
值,不能留运算符的操作数。
与 & 运算符 这部分成为 L 值 ?
此&
不是运算符,而是声明符的一部分。使用 &
,从函数返回一个引用,您可以将其用作运算符的左操作数。
- "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类型吗