5

我采用二次表达式,其中y=ax^2 + bx + cwith 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;
}

但是,我并不完全了解如何设置它,并希望任何专家帮助解决这个问题。

4

4 回答 4

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;

于 2010-09-10T11:57:45.657 回答
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;
};
于 2010-09-10T12:01:20.870 回答
2

使用成员初始化器列表:

quadratic():
    a(0),b(0),c(0)
{}

quadratic(double a_,double b_,double c_):
    a(a_),b(b_),c(c_)
{}
于 2010-09-10T11:57:54.003 回答
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)
{ 
}
于 2010-09-10T11:57:24.427 回答