C++ std::valarray 成员变量意外更改

C++ std::valarray member variable unexpected change

本文关键字:意外 变量 成员 std valarray C++      更新时间:2023-10-16

我有一个类A,其构造函数将 std::valarray[^1] 作为其参数之一,但是我发现一旦构造函数完成,它的值就会变为大的随机数。

顺便说一句,我的getters和setters可能存在问题,我刚刚开始在C++的同义词中使用,借助这个SO问题和Stroustrup的C++编程语言18.3.5 Accessor Functions

Stroustrup 的constexpr double real() const { return re; }格式是我的示例最终使用的格式,但是没有constexpr因为我的班级不喜欢它(我试图理解为什么但仍然没有得到它(。

用户 deidei 对我的问题的接受答案的评论说std::valarray是"动态的",我想这里的意思是您可以调整它的大小。 当涉及到记忆时,这可能会带来问题,我认为由于这一事实,我的价值观可能以某种方式被覆盖了。

#include <iostream>
#include <valarray>
#include <vector>
class A
{
public:
A(std::valarray<int> b, std::vector<int> c)
{
std::cout<< b[0]  << std::endl;
};
std::valarray<int> get_b() const {return b;};
std::vector<int> get_c() const {return c;};
private:
std::valarray<int> b;
std::vector<int> c;
};
int main()
{
std::valarray<int> b = {1, 3};
std::vector<int> c = {4, 2, 8, 17};
A a(b,c);
std::cout<< a.get_b()[0] << std::endl; // returns a random large number such as 26618992
return 0;
}

什么问题可能导致此问题?

[^1]:(灵感来自我上一个问题的答案,对于那些在家玩的人(

我的理解是,由于构造函数将 b 和 c 作为 参数,然后它们将被分配给相同的成员变量 名字

这是不正确的。可以通过成员初始值设定项列表、默认初始化或直接在构造函数主体中赋值来初始化成员变量。例如:

A(std::valarray<int> b, std::vector<int> c)
: b(b), c(c)
{...

private:
std::valarray<int> b = {1, 3};
std::vector<int> c = {4, 2, 8, 17};

A(std::valarray<int> b, std::vector<int> c)
{
this->b = b;
this->c = c;
...

您没有执行上述任何操作,因此intvalaray大小为 0。当您返回其副本并尝试访问不存在的元素时

返回一个随机的大数,如26618992

您从内存中获取一些垃圾值。