C++ std::valarray 成员变量意外更改
C++ std::valarray member variable unexpected change
我有一个类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;
...
您没有执行上述任何操作,因此int
的valaray
大小为 0。当您返回其副本并尝试访问不存在的元素时
返回一个随机的大数,如26618992
您从内存中获取一些垃圾值。
相关文章:
- 变量的值何时可以在C++中意外更改?
- C++ std::valarray 成员变量意外更改
- 将 std::sort 与指向整数变量的指针一起使用会产生意外的输出
- 意外的静态计数器变量行为
- 条件变量的"wait"函数在提供谓词时导致意外行为
- 具有类构造函数和类成员变量的意外输出值
- 带有布尔转换的变量的原始打印:意外行为
- 变量的字节表示的意外结果
- 仅在标头中的外部变量意外工作,原因是什么
- 将指针传递到私有变量时出现意外行为
- 变量意外更改值
- 对变量范围感到困惑 - 析构函数意外调用
- 声明变量大小数组时出现意外的编译器行为
- 传递给函数的变量,提供意外值
- 为什么我的 C++ 类变量意外地在范围之外更改
- 返回递归函数的bool意外地更改了变量
- 对整型变量的双精度值-意外输出
- 对象的成员变量发生意外更改
- 模板类中的变量模板-意外错误(可能存在错误?)
- 在程序中使用非类型模板参数而未给局部变量赋值时,会导致意外结果