C++类变量:初始化与向量的赋值和初始化

C++ Class Variables: Initialization vs. Assignment and Initialization of vectors

本文关键字:初始化 赋值 向量 类变量 C++      更新时间:2023-10-16

我正在开发一个C++程序,该程序有一系列类变量,其中包含部分或全部成员变量的向量。我的问题有三个:

  1. 使用构造函数初始化作为类一部分的向量变量是否直接(请参阅下面的示例类定义)?有人能为下面的类(或者至少为单个和二维向量变量)发布一个构造函数的例子吗?

  2. 在我的代码中简单地初始化变量(即,使用循环迭代向量的每个元素以分配初始值)有问题吗?

  3. 同样,如果变量需要在不同的上下文中初始化为不同的值(例如,一个实例中为零,另一个实例为某个数字),有没有办法通过构造函数来处理?

示例类定义:

class CreditBasedPoolLevel {
public:
    int NumofLoans; 
    int NumofPaths; 
    int NumofPeriods; 
    double TotalPoolBal;
    vector<int> NumofModeled;
    vector<double> ForbearanceAmt;
    vector<double> TotalAmtModeled;
    vector<vector<int>> DefCountPoolVector;
    vector<vector<double>> TermDefBalPoolVector;
    vector<vector<double>> BalloonDefBalPoolVector;
    vector<vector<double>> TermDefBalPoolVectorCum; 
    vector<vector<double>> TermSeverityAmt;
    vector<vector<double>> TermELAmtPoolVector;
    vector<vector<double>> BalloonELAmtPoolVector;
    vector<vector<double>> TermELAmtPoolVectorCum;
};
  1. 在C++中,初始化变量会调用其构造函数。在向量的情况下,这意味着它创建了一个向量的实例,无论初始容量是多少(我相信是10),都没有值。在这一点上,您需要使用push_back来填充向量-即使它有容量,如果您尝试直接访问未填充的区域,它也会导致未定义的行为(例如使用Num_Modeled[0])。您也可以使用向量Num_Modeled(x)(x是空间数)用一定的空间初始化它,但通常因为向量具有动态大小,所以使用push_back更容易,除非有某种原因需要无序输入数据。

  2. 与一的容量部分相关,如果你试图访问向量中未填充的空间,你会得到未定义的行为。不过,用循环填充向量是相当标准的做法,例如:

    vector<int> v;
    int in = 0;
    while (cin)
    {
       cin >> in;
       v.push_back(in);
    }
    
  3. 是的,但请记住,与函数一样,构造函数只根据输入参数的类型进行区分。因此,例如,可以有CreditBasedPoolLevel(int level)CreditBasedPoolLevel(vector<int> levels),但不能有定义为CreditBasedPoolLevel(int otherint)的另一个,因为它会与第一个冲突。如果您希望能够接受相同类型的不同上下文输入,可以使用另一个变量来定义构造函数类型,如CreditBasedPoolLevel(int input, string type),并使用开关块来定义基于该类型的初始化逻辑。

对于第三个问题,只需添加一个带有参数的构造函数,该参数是您想要初始化向量的值。

如果你只想默认构建向量,那么就不需要做任何事情了。

构造函数可能看起来像这样:

CreditBasedPoolLevel::CreditBasedPoolLevel()
{
   const int numDefCountPools = 13;
   const int numDefCountPoolEntries = 25;
   for(int i = 0; i < numDefCountPools; i++)
   {
      vector<int> v;
      for(int j = 0; j < numDefCountPoolEntries; j++)
      {
          v.push_back(j + i * 5);  // Don't know what value you ACTUALLY want to fill here
      }
      DefCountPoolVector.push_back(v);
   }
}

请注意,这是一个解决方案,它实际上取决于你想要什么价值观,你如何组织它们,等等,什么是适合你的案例的"正确"解决方案。