为什么我不能在类中使用参数构造函数?

时间:2019-11-10 13:38:44

标签: c++ oop c++11 constructor initialization

我在代码中使用Eigen 3.3.7库。我可以在main()中创建并使用数据填充矢量,如下所示:

Vector3d H1(0.0, 0.0, 1.0);
Vector3d H2 = {0.0, 0.0, 1.0};
Matrix3d D(3,2); // Matrix is only initialised

但是,如果我在一个类中执行相同的操作,则会收到语法错误:

class data {
    Vector3d H1(0.0, 0.0, 1.0);   //syntax error
    Vector3d H = {0.0, 0.0, 1.0}; //still works
    MatrixXd D(3,2);              //syntax error
};

问题1:

为什么我不能在类的正文中使用相同的语法?

如何使用Eigen将3-by-2矩阵定义为data的属性?

问题2:

我知道H1(0.0, 0.0, 1.0)版本会调用参数构造函数,但是,我不知道在Vector3d H2 = {0.0, 0.0, 1.0};行下会发生什么。那么实际上呢?为何在第二种情况下有效?

1 个答案:

答案 0 :(得分:2)

对于Q1,default member initializer(自C ++ 11起)仅支持括号初始化器和等号初始化器,但不支持括号。所以你可以

class data {
    Vector3d H1{0.0, 0.0, 1.0};
    Vector3d H2 = Vector3d(0.0, 0.0, 1.0); // or as you showed, Vector3d H2 = {0.0, 0.0, 1.0}
    MatrixXd D1{3, 2};
    MatrixXd D2 = MatrixXd(3, 2); // or MatrixXd D2 = {3,2};
};

对于Q2,Vector3d H2 = {0.0, 0.0, 1.0};执行copy-list-initialization(自C ++ 11起),其效果取决于Vector3d的实现方式。 (在这种情况下,它似乎与Vector3d H1(0.0, 0.0, 1.0)相同,即调用了适当的构造函数来初始化对象。)