首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++编写原型构造函数

用C++编写原型构造函数
EN

Stack Overflow用户
提问于 2010-09-10 19:54:49
回答 4查看 5.9K关注 0票数 5

我采用了一个二次表达式,其中y=ax^2 + bx + cabc是常量,x是变量。下面是我的类:

代码语言:javascript
复制
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;
};

我要为这个类创建两个构造函数,这样下面的代码就是合法的

代码语言:javascript
复制
quadratic y1 = quadratic(1.0, -5.0, 7.0);
quadratic y2 = quadratic(-3.0, -2.0, 10.0);
quadratic y3;

当第二个构造函数中的参数指示系数的初始值时,默认构造函数应设置为零。

下面是我认为我应该这样做的方法:

代码语言:javascript
复制
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;
}

然而,我并不完全理解如何设置,并感谢任何大师在解决这个问题上的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-10 19:57:46

您可能应该使用构造函数的初始值设定项列表:

代码语言:javascript
复制
quadratic() : a(0), b(0), c(0)
{
}

quadratic(double A, double B, double C) : a(A), b(B), c(C)
{
}

上面的代码使用C++语言的一部分来初始化成员变量,称为初始化器列表。

您对带参数的构造函数所做的操作:

代码语言:javascript
复制
double A = double a;
double B = double b;
double C = double c;

首先不会编译,但是即使你简化了你所做的事情:

代码语言:javascript
复制
double A = a;
double B = b;
double C = c;

那么它仍然不会编译,因为A、B和C已经被定义了。当你在类型名后面加上一个变量名时,它会尝试创建一个新的变量。

因此,如果我们再次简化为:

代码语言:javascript
复制
A = a;
B = b;
C = c;

那么这仍然是错误的,但至少它会被编译。这是错误的,因为您将参数设置为未初始化的类变量的值。

相反,你想要:

代码语言:javascript
复制
a = A;
b = B;
c = C;

您对没有参数的构造函数所做的操作:

代码语言:javascript
复制
 double A, double B, double C = 0.0;

这不会编译。在一行中声明多个变量的正确语法如下:

代码语言:javascript
复制
 double A = 0, B = 0, C = 0;

但这仍然是不正确的,它将简单地创建3个新变量A、B和C,并将它们初始化为0。您真正想要的是设置成员变量a、b和c。

所以你想要:

A=b=c= 0;

票数 20
EN

Stack Overflow用户

发布于 2010-09-10 20:01:21

最直接、最简单的方法是:

代码语言:javascript
复制
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也是可以接受的,但使用更多的代码,对我来说,构造函数中的默认值更可取。

除了在构造函数中只使用一个或两个参数不再有效之外,这是相同的替代解决方案:

代码语言:javascript
复制
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;
};
票数 4
EN

Stack Overflow用户

发布于 2010-09-10 19:57:54

使用成员初始值设定项列表:

代码语言:javascript
复制
quadratic():
    a(0),b(0),c(0)
{}

quadratic(double a_,double b_,double c_):
    a(a_),b(b_),c(c_)
{}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3684381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档