我有一个类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
您从内存中获取一些垃圾值。