为派生类C ++使用不同的基础构造函数

时间:2011-08-15 03:03:55

标签: c++ inheritance constructor

根据我的理解,以下代码将按此顺序执行:

  1. 调用派生的构造函数。
  2. 使用默认的基本构造函数构建基础对象。
  3. 派生构造函数的主体执行。
  4. 如果是,是否为成员z分配了两次值?

    class base {
    public:
        int x, y, z;
        base() {x = 0; y = 0; z = 0;};
    };
    
    class derived : public base {
    public:
        derived() {z = 5;};
    };
    

    是否有更有效的方法来创建“派生”类的对象,因此它使用不同的构造函数,在这种情况下,只使用成员x和ya赋值,让z在赋值中赋值( )?

5 个答案:

答案 0 :(得分:3)

是的,有一种更有效的方法,但它需要更多的代码(从而增加了维护开销)。

class base {
public:
    int x, y, z;
    // Default constructor
    base() {x = 0; y = 0; z = 0;};
    // Constructor to be called if you want to override the z value
    base(int zValue) { x=0; y=0; z=zValue; };
};

class derived : public base {
public:
    derived() : base(5) {};
};

答案 1 :(得分:1)

不确定。使用所谓的ctor-initializer

class base {
public:
    int x, y, z;
    base(int z = 0) : x(0), y(0), z(z) {};
};

class derived : public base {
public:
    derived() : base(5) {}
};

构造函数声明中:之后和第一个{之前的代码是ctor-initializer。 (有些人称之为“初始化列表”,但ctor-initializer是C ++标准所称的。)

只要可以将类成员初始化为某个值,就应始终使用ctor-initializer。虽然它对int无关紧要,但使用ctor-initializer进行初始化可能比默认构造类成员然后赋值更快。

答案 2 :(得分:1)

是的,z在您的示例中分配了两次,就像它看起来一样。

要做你想做的事,你可以做这样的事情,这需要几乎完全相同数量的代码(只是在这里和那里移动一些):

class base {
public:
    int x, y, z;
    base(int z = 0) : x(), y(), z(z) { }
};

class derived : public base {
public:
    derived() : base(5) { } // with this one, z is assigned 5 once
    // or
    derived() { } // z is assigned 0 once
};

答案 3 :(得分:0)

当然,你可以这样做。

使用 member-initialization-list

class base {
public:
    int x, y, z;
    base(int a, int b, int c) : x(a), y(b), z(c) {}
                           //^^^^^^^^^^^^^^^^^^^ it's member-initialization-list!

};

class derived : public base {
public:
    derived() : base(0,0,5) {}
            // ^^^^^^^^^^^ call the specific base constructor
};

答案 4 :(得分:0)

详细说明安德鲁的回答,如果你想确保{em>所有的base成员只被设置一次,并且以最有效的方式,你可以使用成员列表初始值设定项,而不是在构造函数中设置值。

class base {
public:
    int x, y, z;
    base() : x(0), y(0), z(0) {};
    base( int xval, int yval, int zval ) : 
            x(xval), y(yval), z(zval) 
            { };
};

class derived : public base {
public:
    derived() : base( 0, 0, 5 ) {};
};

大多数编译器都会为: x(_x), ...生成相同的代码,就像在构造函数中设置值一样,但我看到有一些代码没有。