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

时间:2018-06-13 17:22:37

标签: c++

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

顺便说一句,我的getter和setter可能会出现问题,我刚刚开始在C ++的cotext中使用SO question和来自Stroustrup's The C++ Programming Language18.3.5 Accessor Functions

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

用户accepted answer对我的问题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] :(受answer to my previous question启发,适合那些在家里玩的人)

1 个答案:

答案 0 :(得分:2)

  

我的理解是,因为构造函数将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;
    ...

您没有完成上述任何操作,因此valaray int的{​​{1}}大小为0.当您返回其副本并尝试访问不存在的元素时

  

//返回一个随机大数,例如26618992

你从内存中获得了一些垃圾值。