如何使用const_reference类型来声明一个变量并为其赋值 front() 函数的返回值
How to use const_reference type to declare a variable and assign to it, the return value of front() function
我声明了一个向量,并用三个值将其初始化为,
vector<int> vec{1, 2, 3};
我尝试将 vec.front() 的返回值分配给引用变量 a
。
如何使用正确的数据类型声明?
我试过了
vector<int>::const_reference &a = vec.front();
但是这句话是什么意思呢?
我可以先使用正确的数据类型声明变量 a 然后使用
a = vec.front();
将 vec.front() 的返回值分配给变量 a
?如果是,那么我应该写什么?
我可以先使用正确的数据类型声明变量 a 然后使用
a = vec.front();
将 vec.front() 的返回值分配给变量
a
a
不是一个普通变量;它是一个引用,声明一个引用而不说明它指的是什么是不合法的:
const int& a; // Illegal
声明引用后,对变量执行的所有操作实际上都是对其引用的值执行的,因此您永远无法更改引用的内容。
const int& a = b;
a = 10; // Changed the value of b.
我试过了,
vector<int>::const_reference &a = vec.front();
这似乎是一种过于冗长的说法:
const int& a = vec.front();
vec.front()
返回对向量的前端元素的引用。 const int& a = vec.front()
声明变量a
,以便它是对向量的前端元素的引用。
这通过承诺只读值来避免复制。
如果你说:
int a = vec.front();
a
现在是数组第一个元素的副本,但您可以自由更改它。
在 int 的情况下,没有性能优势。但是,如果您的向量是 string
s 的向量,则采用引用将避免复制字符串,如果您不打算修改内容,这可能是比引用显着的性能优势。
std::string str = "hello world, this is a long string.";
const std::string& a = str; // Reference, no copy
std::string b = str; // Copy of str, takes extra effort
vector::front()
返回对向量中第一个元素的引用。因此,您可以声明存储在向量中的类型的引用,也可以使用向量类中定义的类型(vector<int>::reference
或vector<int>::const_reference
)来声明引用。
vector <int> v1;
v1.push_back(10);
v1.push_back(11);
vector<int>::reference var1 = v1.front( ); // Returns a reference to the first element you can modify or
int& x = v1.front(); // returns a reference to the first element you can modify
.....
vector<int>::const_reference var2 = v1.front(); // Returns a reference to the first element you can't modify
const int& y = v1.front(); // Return a reference to the first element you can't modify
我可以先使用正确的数据类型声明变量 a 然后使用
不。由于要声明引用,因此必须在声明期间对其进行初始化。
还有一件事:
vector<int>::const_reference &a=v1.front(); // This will not compile, because you are trying to take a reference of a reference
除了@kfsone的好答案之外,还有一个(让我说)技巧可以做一些类似于你所问的事情。
我会做所有事情,但我在下面向您展示的内容。
无论如何,为了完整起见,如果你有一个reference_wrapper
,你实际上可以把它重新绑定到与你用来创建它的引用不同的引用。
这意味着您可以按照要求创建一个类似对象的引用以供以后使用。
下面是一个最小的工作示例:
#include<functional>
#include<vector>
#include<cassert>
int main() {
int x;
std::reference_wrapper<int> w{x};
std::vector<int> vec{1, 2, 3};
w = vec[0];
w.get() = 42;
assert(vec[0] == 42);
}
同样,这是出于好奇。
我不建议你在代码中这样做(当然,除非你讨厌你的同事)。
- 为"adjacent"变量赋值时出现问题
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何在不使用赋值运算符的情况下为动态变量赋值?
- 为什么我不能为变量赋值函数?
- 可视化的c++变量赋值使代码正常工作
- 如何为结构类型变量赋值
- 使用 boost python 从 c++ 为 python 中的类成员变量赋值
- QT变量赋值,<没有这样的值>,SIGSEGV
- C++:为全局类变量赋值
- 从类外部为类中的变量赋值
- 在 c++ 中为字符串变量赋值
- 为类中的私有静态变量赋值
- 使用类为变量赋值 (C++)
- 在编译时为变量赋值
- C ++变量赋值,这是正常的方式吗
- 在C++中为类变量赋值后声明类变量
- 了解工厂方法和静态变量赋值的返回值优化 (Visual Studio)
- 如何在 c++ 中从函数获取返回值而不为其变量赋值
- 简单的引用变量赋值导致对象的全局指针出现segfault