我正在采用二次表达式,其中y=ax^2 + bx + c
a
,b
,c
是常量,x
是变量。这是我的班级:
class quadratic {
public:
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);
private:
double a;
double b;
double c;
};
我要为类创建两个构造函数,以便以下是合法的
quadratic y1 = quadratic(1.0, -5.0, 7.0);
quadratic y2 = quadratic(-3.0, -2.0, 10.0);
quadratic y3;
默认构造函数应设置为零,而第二个构造函数中的参数指示系数的初始值。
以下是我认为我应该这样做的方式:
quadratic() //default values
{
double A, double B, double C = 0.0;
}
quadratic(double A, double B, double C) //initial values
{
double A = double a;
double B = double b;
double C = double c;
}
然而,我并没有完全理解如何设置它,并希望任何大师帮助解决这个问题。
答案 0 :(得分:20)
您应该使用构造函数的初始化列表:
quadratic() : a(0), b(0), c(0)
{
}
quadratic(double A, double B, double C) : a(A), b(B), c(C)
{
}
以上使用C ++语言的一部分来初始化称为初始化列表的成员变量。
您为具有参数的构造函数所做的工作:
double A = double a;
double B = double b;
double C = double c;
首先不会编译,但即使你简化了你所做的事情:
double A = a;
double B = b;
double C = c;
然后它仍然无法编译,因为已经定义了A,B和C.当您输入类型名称后跟变量名称时,它将尝试创建一个新变量。
因此,如果我们再次简化为:
A = a;
B = b;
C = c;
然后这仍然是错误的,但至少它会编译。这是错误的,因为您将参数设置为未初始化的类变量的值。
相反,你想:
a = A;
b = B;
c = C;
你为没有参数的构造函数做了什么:
double A, double B, double C = 0.0;
这不会编译。在一行中声明许多变量的正确语法如下:
double A = 0, B = 0, C = 0;
但这仍然不正确,它只会创建3个新变量A,B和C并将它们初始化为0.您真正想要的是设置成员变量a,b和c。
所以你想要:
a = b = c = 0;
答案 1 :(得分:4)
这样做的直接而简单的方法是:
class quadratic {
public:
explicit quadratic(double A=0,double B=0,double C=0): a(A),b(B),c(C) { }
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);
private:
double a;
double b;
double c;
};
声明第二个没有参数的构造函数并将所有值都指定为0也是可以接受的但是使用了更多的代码,对我来说,构造函数中的默认值是可取的。
除了在构造函数中仅使用1或2个参数不再有效这一事实外,这是替代解决方案相同:
class quadratic {
public:
quadratic(double A,double B,double C): a(A),b(B),c(C) { }
quadratic(): a(0), b(0), c(0) { }
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);
private:
double a;
double b;
double c;
};
答案 2 :(得分:2)
使用成员初始化列表:
quadratic():
a(0),b(0),c(0)
{}
quadratic(double a_,double b_,double c_):
a(a_),b(b_),c(c_)
{}
答案 3 :(得分:1)
使用初始化列表初始化类成员变量。你写的是作业。
OP中的代码也分配给构造函数中定义的局部变量,而不是类成员变量。我想这是为了初始化类
的成员变量quadratic() : a(0.0), b(0.0), c(0.0)
{
}
quadratic(double A, double B, double C) : a(A), b(B), c(C)
{
}