2011-08-15 43 views
0

从我的理解下面的代码将在这个顺序执行:使用不同的基础构造派生类C++

  1. 派生构造函数被调用。
  2. 基础对象是使用默认的基础构造函数构造的。
  3. 执行派生构造函数的主体。

如果是这样,是不是成员z分配了两次值?

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

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

有用来创建类“衍生”的对象,因此使用不同的构造,在这种情况下,一个只会分配成员x和雅值,使Z A更有效的方式来分配derived()中的值?

回答

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 
}; 
+0

+1:我没想到使用默认参数。 –

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) {}; 
}; 
+0

打了我两秒:) –

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 s来说并不重要,但使用ctor-initializer的初始化可以比默认构造类成员然后进行赋值更快。

0

当然,你可以这样做。

使用成员初始化列表为:

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 
}; 
0

为了详细说明安德鲁的回答,如果你想真正确保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), ...相同的代码只设置在构造函数的值,但我见过一对夫妇都没有。

相关问题