我稍微上,如果我做了以下会发生什么困惑:的一些简单的构造函数代码解释
class a{
int i;
public:
a(){}
};
class b: public a{
};
int main(){
b b1;
}
由于类b
没有构造,它使用什么构造?它使用默认构造函数a
吗?或者它自己的编译器生成一个?
我稍微上,如果我做了以下会发生什么困惑:的一些简单的构造函数代码解释
class a{
int i;
public:
a(){}
};
class b: public a{
};
int main(){
b b1;
}
由于类b
没有构造,它使用什么构造?它使用默认构造函数a
吗?或者它自己的编译器生成一个?
由于B类没有构造函数,它使用什么构造?它使用默认的构造函数吗?或者它自己的编译器生成一个?
这看起来有点棘手。
在C++标准的条款,类获得编译器生成的构造函数没有参数当程序员没有明确指定一个构造函数。从概念上讲,b
得到这样一个默认的构造函数,然后调用构造函数a
。
在另一个层面上,在一个优化的编译器既不构造有什么 - 他们可能(也可能不会)被完全消除,“不存在”,甚至为一个空函数。所以 - 在这个级别 - 谈论b
的构造函数调用a
的构造函数就是废话。
恕我直言,重要的是要了解这两方面。
乙级将有一个编译器生成的构造,这将依次调用的构造函数。
它有一个编译器生成的“违约”默认的无参数的构造函数和编译器生成的“默认”的拷贝构造函数。如果您的编译器支持它,它也有一个由编译器生成的“默认”移动构造函数。
class b
会由编译器生成的默认构造函数。由于b
继承a
,订单将首先构造a
,然后b
。
有两个构造函数将被调用 - 第一个构造函数a
用于基类初始化,然后是构造函数b
。由于您没有为b
定义构造函数,编译器会为您生成一个默认的构造函数。由于您的b
类没有任何需要构造的成员,因此该默认构造函数将为空。