检查使用初始化列表时传递给构造函数的参数 - C++

Check parameters passed to constructor when using initialization lists - C++

本文关键字:构造函数 参数 C++ 初始化 列表 检查      更新时间:2023-10-16

我有一个包含向量作为数据成员的类。

调用构造函数时,我希望所述数据成员由复制构造函数初始化,而不是默认初始化(空矢量对象),因此我使用初始化列表。

#include <vector>
using namespace std;
struct MyStruct {
    vector<double> V;
    vector<double> A;
    vector<double> B;
    MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
    : V(vee),
    A(mat[0]),
    B(mat[1])    
{
    /* Rest of the constructor here*/ 
}

我的问题是:

  • 与允许默认初始化和使用其他方法相比,这样做是否会提高效率? 例如,做

    V.assign(vee)

  • 有没有办法在进行默认初始化或列表初始化之前让构造函数返回检查和错误/消息?

例如,如果

vector<vector<double>>> 2 的大小,我希望 ctor 停止,原因很明显,否则上述内容会产生 seg 错误,我希望在调用构造函数时自动执行此过程。

我想

如果你想避免异常,你可以做这样的事情。它使用三元运算符检查vector的大小,如果mat中不存在空vector,则使用空进行初始化。

#include <vector>
using namespace std;
struct MyStruct {
    vector<double> V;
    vector<double> A;
    vector<double> B;
    MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
    : V(vee),
    A(mat.size() < 1 ? vector<double>():mat[0]),
    B(mat.size() < 2 ? vector<double>():mat[1])
{
    // If you then want to throw your own exception:
    if(mat.size() < 2)
        throw std::range_error("accessing mat");
    // alternatively set a flag
    if(mat.size() < 2)
        this->good = false;
}