std::pair<> 中的值是按引用还是按值存储的?
Are the values stored in std::pair<> by reference or by value?
所以我有一个 class myClass
和两个私有变量,比方说 i,j 和一个 class 方法 myMethod
如下-
std::pair<int, int > myClass::myMethod(void)
{
std::pair<int, int> Pair;
this->i = 100;
this->j = 50;
Pair.first = this->i;
Pair.second = this->j;
return Pair;
}
我正在从另一个函数调用方法如下-
std::pair<int, int> receivedPair = myClass.myMethod();
所以如果我编辑 receivedPair
让我们说
receivedPair.first = 200;
Class 变量 i
也会等于 200 吗?
我基本上需要通过引用将变量传递给一系列的几个函数,以便更新相同的内存位置....
TIA
A std::pair
,在你的具体情况下,无非就是这么多的话:
struct pair {
int first;
int second;
};
first
和 second
在您的 std::pair
中是 non-reference class 成员。 std::pair
的完整定义差不多
template<typename T1, typename T2> struct pair {
T1 first;
T2 second;
};
std::pair
的值是按值计算的。
在你的情况下你可以使用
std::pair<std::reference_wrapper<int>, std::reference_wrapper<int>>
作为类型。
参考:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
在您提供的示例中,值按值存储,因为您将类型声明为std::pair<int, int>
。如果您希望通过引用存储值,您可以这样做:
std::pair<int&, int&> myClass::myMethod(void)
{
this.i = 100;
this.j = 50;
std::pair<int&, int&> Pair(this.i, this.j);
return Pair;
}
P.S。我只添加了这个答案,因为我认为之前带有 std::reference_wrapper
的答案不会让您修改参考的内容!然后我发现你可以使用 .get()
.
修改内容
std::pair
存储您告诉它的任何内容。您可以使用 std::pair<int&,int&>
。但是,作为成员的引用有一些缺点。复制、默认构造等是有问题的/不可能的。
与其使用一对引用,不如使用一对引用可能更容易:
struct myClass {
std::pair<int,int>& myMethod() {
return data;
}
private:
std::pair<int,int> data;
};
我声称,如果你不能给成员起比 i
和 j
更好的名字,那么 data.first
和 data.second
也一样好。另一方面,如果你能给出更好的名字,那就这样做:
struct my_i_and_j {
int some_meaningful_name;
int another_meaningful_name;
};
struct myClass {
my_i_and_j& myMethod() {
return data;
}
private:
i_and_j data;
};
但是,请注意,返回对私有数据的 non-const 引用会破坏封装。一旦调用者获得 non-const 引用,他们就可以直接修改私有数据,而您 could/should 实际上将其设为 public 以减少 boiler-plate 并提高清晰度。
所以我有一个 class myClass
和两个私有变量,比方说 i,j 和一个 class 方法 myMethod
如下-
std::pair<int, int > myClass::myMethod(void)
{
std::pair<int, int> Pair;
this->i = 100;
this->j = 50;
Pair.first = this->i;
Pair.second = this->j;
return Pair;
}
我正在从另一个函数调用方法如下-
std::pair<int, int> receivedPair = myClass.myMethod();
所以如果我编辑 receivedPair
让我们说
receivedPair.first = 200;
Class 变量 i
也会等于 200 吗?
我基本上需要通过引用将变量传递给一系列的几个函数,以便更新相同的内存位置....
TIA
A std::pair
,在你的具体情况下,无非就是这么多的话:
struct pair {
int first;
int second;
};
first
和 second
在您的 std::pair
中是 non-reference class 成员。 std::pair
的完整定义差不多
template<typename T1, typename T2> struct pair {
T1 first;
T2 second;
};
std::pair
的值是按值计算的。
在你的情况下你可以使用
std::pair<std::reference_wrapper<int>, std::reference_wrapper<int>>
作为类型。
参考:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
在您提供的示例中,值按值存储,因为您将类型声明为std::pair<int, int>
。如果您希望通过引用存储值,您可以这样做:
std::pair<int&, int&> myClass::myMethod(void)
{
this.i = 100;
this.j = 50;
std::pair<int&, int&> Pair(this.i, this.j);
return Pair;
}
P.S。我只添加了这个答案,因为我认为之前带有 std::reference_wrapper
的答案不会让您修改参考的内容!然后我发现你可以使用 .get()
.
std::pair
存储您告诉它的任何内容。您可以使用 std::pair<int&,int&>
。但是,作为成员的引用有一些缺点。复制、默认构造等是有问题的/不可能的。
与其使用一对引用,不如使用一对引用可能更容易:
struct myClass {
std::pair<int,int>& myMethod() {
return data;
}
private:
std::pair<int,int> data;
};
我声称,如果你不能给成员起比 i
和 j
更好的名字,那么 data.first
和 data.second
也一样好。另一方面,如果你能给出更好的名字,那就这样做:
struct my_i_and_j {
int some_meaningful_name;
int another_meaningful_name;
};
struct myClass {
my_i_and_j& myMethod() {
return data;
}
private:
i_and_j data;
};
但是,请注意,返回对私有数据的 non-const 引用会破坏封装。一旦调用者获得 non-const 引用,他们就可以直接修改私有数据,而您 could/should 实际上将其设为 public 以减少 boiler-plate 并提高清晰度。