2

在 C++中,是否可以有一个构造函数double P1,例如,如果我有一个带有 5 个参数的double P2对象:double P3double P4boolean P5

MyObject (double param1, double param2, true), 然后将 param1 分配给 P1,将 param2 分配给 P2,将 P3 和 P4 分配给 0,将 P5 分配给 true

如果我这样做:

MyObject (double param1, double param2, false),那么param1被赋值给P3,param2被赋值给P4,P1和P2被赋值为0,P5被赋值为false?

即,使用的构造函数是基于最后传入的参数的值吗?

4

5 回答 5

2

你可以有多个构造函数

C(double P1, double P2, double P3, double P4) 
: m_P1(P1), m_P2(P2), m_P3(0),m_P4(0), m_P5(0) { ; }

C(double P1, double P2) 
: m_P3(P1), m_P4(P2) {;}
...

一般来说,对于函数,最好不要使用 bool 来确定行为,因为它会使函数更难以阅读,相反,最好将功能分成两部分,以便功能彼此不同。

PrintAllHtml(bool b) 说少于

PrintHtmlHead() PrintHtmlBody()

并且以后可能更容易修改。

于 2013-10-08T03:55:07.867 回答
1

是的,您可以拥有多个具有不同签名的构造函数,以及一个根据传递的参数表现不同的构造函数。虽然你可能不想太疯狂,因为如果构造函数行为异常,使用你的类的人会很难过。

于 2013-10-08T03:55:43.213 回答
1

只需在构造函数中有一个 if 语句

MyObject(double par1, double par2, bool par3)
{
    this->p5 = par3;
    if(par3)
    {
        this->p1 = par1;
        this->p2 = par2
        this->p3 = 0;
        this->p4 = 0;
    }
    else
    {
        this->p1 = 0;
        this->p2 = 0;
        this->p3 = par1;
        this->p4 = par2;
    }
}
于 2013-10-08T03:57:12.010 回答
1

如果trueandfalse始终是常量(即,您总是要传递trueor false而不是一些布尔变量),那么您可以使用模板和专门化来执行此操作。坦率地说,我很难建议它。

在我看来,完成这项工作最直接的方法就是if在 ctor 中使用一个语句:

MyObject(double P1, double P2, bool b) { 
    if (b) {
        P1_ = P1;
        P2_ = P2;
        P3_ = P4_ = 0.0;
        P5 = true;
    }
    else {
        P3_ = P1;
        P4_ = P2;
        P1_ = P2_ = 0.0;
        P5 = false;
    }
}

然而,副手,我想我会退后一步,更努力地思考你在做什么。将布尔值作为参数传递通常不是一个好主意,因为它在传达含义方面做得很差——即使在最好的情况下,MyObject(1, 2, true);vs . 的含义MyObject(2, 3, false);也不明显。在您的情况下,它看起来比平时更没有意义,以至于您需要阅读 ctor 才能了解其中任何一个的作用。

摘要:是的,这是可能的——但我真的怀疑这是一个好主意。

于 2013-10-08T04:06:45.827 回答
1

这是另一种选择。而不是更改或提供两个,因为这不是你想要做的,而不是在你的构造函数中扩展代码试试这个:

    MyObject(double param1, double param2, bool param3) {
        P5 = param3;
        if (P5)
            defaultConstructor(param1, param2, 0.0, 0.0);
        else
            defaultConstructor(0.0, 0.0, param1, param2);
    }

    void defaultConstructor(double param1, double param2, double param3, double param4) {
        P1 = param1;
        P2 = param2;
        P3 = param3;
        P4 = param4;
    }
};

这对我来说是直截了当的,而且更干净——当然是意见。很抱歉在评论中指出了明显的内容;)

于 2013-10-08T04:45:49.260 回答