为派生类使用不同的基构造函数
Using a different base constructor for a derived class C++
根据我的理解,以下代码将按此顺序执行:
- 基对象是使用默认的基构造函数构造的。
- 执行派生构造函数的主体。
如果是,成员z不是被赋值两次吗?
class base {
public:
int x, y, z;
base() {x = 0; y = 0; z = 0;};
};
class derived : public base {
public:
derived() {z = 5;};
};
是否有一种更有效的方法来创建类"派生"的对象,所以它使用不同的构造函数,在这种情况下,一个只会分配成员x和y一个值,留下z在派生()中分配一个值?
是的,有一种更有效的方法,但它将需要更多的代码(从而增加维护开销)。
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) {};
};
是的,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
};
当然。使用所谓的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
s将类成员初始化为某个值。虽然这对int
并不重要,但使用ctor-initializer
初始化可以比默认构造类成员和赋值更快。
当然可以。
使用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
};
详细说明Andrew的回答,如果您真的想确保 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), ...
生成与在构造函数中设置值相同的代码,但我看到过一些编译器没有这样做。
相关文章:
- 如何委托派生类使用其父构造函数?
- 如果基类包含双指针成员,则派生类的构造函数
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 在没有默认构造函数的情况下创建的派生对象
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何在派生构造函数中多次构造基类
- C++(控制台)构造函数和派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 将派生类的构造函数声明为父类的友元
- 如何为具有私有成员的派生类实现移动构造函数
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在派生自线程类的构造函数中传递字符串
- C++ 为什么要将对基类的引用传递给派生类的构造函数
- C++将派生类的const值传递给基意外行为的构造函数
- 在模板派生类中继承具有类型别名的构造函数
- 正在调用基方法,而不是从构造函数派生方法