在constructor中调用类成员的构造函数
calling constructor of a class member in constructor
可以在类的构造函数中调用成员的构造函数吗?
假设在类MClass
中有一个类类型为foo
的成员bar
。我可以在MClass的构造函数中调用constructor of bar吗?如果不是,那么我如何初始化我的成员栏?
这是一个在组合(聚合)中初始化成员的问题。
当然可以!这就是构造函数初始化列表的作用。这是初始化没有默认构造函数的成员以及常量和引用时需要的基本特性:
class Foo
{
Bar x; // requires Bar::Bar(char) constructor
const int n;
double & q;
public:
Foo(double & a, char b) : x(b), n(42), q(a) { }
// ^^^^^^^^^^^^^^^^^^^
};
您还需要初始化列表来指定派生类构造函数中基类的非默认构造函数。
可以,
#include <iostream>
using std::cout;
using std::endl;
class A{
public:
A(){
cout << "parameterless" << endl;
}
A(const char *str){
cout << "Parameter is " << str <<endl;
}
};
class B{
A _argless;
A _withArg;
public:
// note that you need not call argument-less constructor explicitly.
B(): _withArg("42"){
}
};
int main(){
B b;
return 0;
}
输出为:
parameterless
Parameter is 42
在ideone.com上查看
像这样:
class C {
int m;
public:
C(int i):
m(i + 1) {}
};
如果成员构造函数需要参数,可以传递参数。它们可以是由类构造函数参数和已经初始化的类型组成的表达式。
记住:成员是按照它们在类中声明的顺序初始化的,而不是按照它们在初始化列表中出现的顺序初始化的。
通过初始化列表,如果基类没有默认构造函数
struct foo{
foo( int num )
{}
};
struct bar : foo {
bar( int x ) : foo(x)
// ^^^^^^ initializer list
{}
};
可以。这是在类的初始化列表中完成的。例如:
class MClass
{
foo bar;
public:
MClass(): bar(bar_constructor_arguments) {};
}
这将使用传入的参数构造bar
。通常,参数将是类的其他成员或传递给构造函数的参数。对于没有无参数构造函数的任何成员都需要此语法。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- constexpr构造函数需要常量成员函数时出现问题
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在成员构造函数之后调用基类构造函数
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- 用作成员构造函数参数的函数的求值顺序
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
- 不正确的成员构造函数定义
- 我可以基于模板参数将某个值传递给成员构造函数吗
- 在类定义中调用成员构造函数
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 正在从成员构造函数调用虚拟函数
- c++初始化类成员构造函数
- c++模板限制成员构造函数