C ++中类的构造函数中的不同参数

时间:2009-02-24 07:54:19

标签: c++ constructor

如果参数类型不同,我可以以不同的方式使用构造函数吗?即int或float。

如果我这样做,那就说新对象(3) 构造函数在每个索引处填充一个数组为3

假设我这样做,新对象(3.5) 构造函数为每个索引

填充索引+ 3.5的数组

假设我这样做,新的Object() 构造函数在每个索引

处填充一个数组为0.0

有没有办法只用一个构造函数来实现这个目的?或者我需要三个不同的构造函数?

感谢。

12 个答案:

答案 0 :(得分:6)

当然你可以有很多建设者!构造函数的重载与任何函数/成员的重载相同。

请记住,有时编译器可以通过自动转换参数来隐式调用您不希望调用的构造函数。

您可以在构造函数声明中添加关键字explicit以禁止任何自动转换。

答案 1 :(得分:3)

你可以用一个构造函数来完成它,但它会像地狱一样难看。 提供了3种构造函数方法,因为它分离了用法并简化了代码。

答案 2 :(得分:2)

听起来你正在为维护噩梦做准备。我建议你使用命名的构造函数idiom:

class Object
{
public:
    // Sets all elements to 0.
    Object();

    // Sets all elements to value.
    static Object Fill(double value);

    // Sets all elements to the previous + delta, beginning at start.
    static Object Accumulate(double start, double delta);
};

答案 3 :(得分:1)

如果您只关心内置类型,则可以使用类型提升和默认值:

struct Object
{
    Object(double value = 0.0)
    {
        // do that thing you do
    }
};

答案 4 :(得分:1)

只要传递的参数总是相同类型,您就可以使用一个构造函数,否则需要几个。

似乎最明显的解决方案是在对象构造函数中插入一个switch语句。

示例:

public Object(int num)
{
switch (num)
{
case 1: array[i]  = num;
break
case 2: array[i] = num * 2;
}

}

答案 5 :(得分:1)

对于纯粹基于参数类型的构造函数,有一个不同的行为通常是一个坏主意,特别是对于可以在彼此之间轻易隐式转换的内置类型。

话虽如此,纯粹作为编程练习,可以使用一个构造函数来完成此操作,但是您必须使用一个代理类,从要区分的类型之间进行隐式转换以实现您想要的。作为预先解决的解决方案,boost :: variant符合要求。您可能不认为这符合单个构造函数的要求,因为它依赖于第二个类的多个构造函数(或构造函数模板)。

class Object
{
public:
        Object( const boost::variant< int, double >& val = 0 )
        {
                switch( val.which() )
                {
                case 0:
                        // TODO: Fill array with val
                        break;
                case 1:
                        // TODO: fill array with val + index
                        break;
                }
        }

// TODO: Add array member
};

答案 6 :(得分:0)

您需要3个不同的构造函数。

答案 7 :(得分:0)

需要多个构造函数,每个构造函数对应一个不同的参数类型。

答案 8 :(得分:0)

您将需要三个不同的构造函数(重载它们)或一个具有默认值的某些属性。

这可以实现,但我建议使用3种不同的构造函数来实现代码清晰度等。

答案 9 :(得分:0)

不仅需要三个不同的构造函数,还需要三个不同的构造函数。它将使代码更清晰,更易于理解,维护和单元测试。

答案 10 :(得分:0)

您可以将行为Object()Object(3)计算在一起,因为它们会做同样的事情。只需编写你的构造函数:

class Object {
    // fills an array with n at every index
    Object(int n = 0) { ... }
};

问题是带有float(在示例中为3.5)的构造函数要分开,如下所示:

class Object {
    // fills an array with n at every index
    Object(int n = 0) { ... } // handles Object() AND Object(3)

    // fills an array with index + n at every index
    Object(float n)   { ... } // handles Object(3.5)
};

答案 11 :(得分:0)

使用3种不同的构造函数,因为逻辑根据参数的类型而不同。另外,请注意编译器完成的类型提升。否则,在执行代码时可能会出现意外情况。