C++类变量:初始化与向量的赋值和初始化
C++ Class Variables: Initialization vs. Assignment and Initialization of vectors
我正在开发一个C++程序,该程序有一系列类变量,其中包含部分或全部成员变量的向量。我的问题有三个:
-
使用构造函数初始化作为类一部分的向量变量是否直接(请参阅下面的示例类定义)?有人能为下面的类(或者至少为单个和二维向量变量)发布一个构造函数的例子吗?
-
在我的代码中简单地初始化变量(即,使用循环迭代向量的每个元素以分配初始值)有问题吗?
-
同样,如果变量需要在不同的上下文中初始化为不同的值(例如,一个实例中为零,另一个实例为某个数字),有没有办法通过构造函数来处理?
示例类定义:
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;
};
-
在C++中,初始化变量会调用其构造函数。在向量的情况下,这意味着它创建了一个向量的实例,无论初始容量是多少(我相信是10),都没有值。在这一点上,您需要使用push_back来填充向量-即使它有容量,如果您尝试直接访问未填充的区域,它也会导致未定义的行为(例如使用Num_Modeled[0])。您也可以使用向量Num_Modeled(x)(x是空间数)用一定的空间初始化它,但通常因为向量具有动态大小,所以使用push_back更容易,除非有某种原因需要无序输入数据。
-
与一的容量部分相关,如果你试图访问向量中未填充的空间,你会得到未定义的行为。不过,用循环填充向量是相当标准的做法,例如:
vector<int> v; int in = 0; while (cin) { cin >> in; v.push_back(in); }
-
是的,但请记住,与函数一样,构造函数只根据输入参数的类型进行区分。因此,例如,可以有
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);
}
}
请注意,这是一个解决方案,它实际上取决于你想要什么价值观,你如何组织它们,等等,什么是适合你的案例的"正确"解决方案。
- 初始化右值引用成员
- 如何初始化所有值相同的 2D 数组?
- C++ 在循环中添加计数器变量并再次初始化其值
- HBOEHM 垃圾回收器未初始化的值错误和泄漏
- 复合赋值的左侧表达式是未初始化的值.计算出的值也将是垃圾
- Valgrind:使用atomic::compare_exchange_weak时,条件跳转或移动取决于未初始化的值
- 初始化器值太多
- 回文程序和条件跳转或移动取决于未初始化的值
- 访问未初始化的值,很可能在向量中
- 为什么使用此奇怪的调用来初始化会员值的类中此功能
- 指针的数组要分类对象和初始化成员值
- 未初始化的值是由堆分配创建的:Unordered_map
- 未初始化的值是由堆栈分配 - Qt - C++创建的
- 条件跳转或移动取决于函数调用中未初始化的值
- 是否可以在一行中初始化一个值递增的向量
- 指针向量,其元素用new初始化:赋给新值时会发生什么
- 如何使我的向量类支持直接初始化/赋值
- 没有默认构造函数的初始化赋值
- C++11:类初始化赋值顺序的主体
- 通过显式调用类构造函数与默认初始化+赋值运算符来使用对象