【发布时间】:2016-04-23 03:37:48
【问题描述】:
最近看了简单的STL源码,代码如下:
#include <iostream>
#include <cstddef>
using namespace std;
class alloc
{
};
template <typename T, typename Alloc = alloc, size_t Bufsiz = 0>
class deque
{
public:
deque() { cout << "deque()" << endl; }
};
template <typename T, typename Sequence = deque<T> >
class stack
{
public:
stack() { cout << "stack()" << endl; }
private:
Sequence c;
};
int main()
{
stack<int> x;
return 0;
}
输出:
deque()
stack()
当我创建一个堆栈对象时,它应该首先调用堆栈构造函数。但事实并非如此。
为什么编译器会先调用deque构造函数?
【问题讨论】:
-
先处理模板。
-
@RetiredNinja 只涉及成员初始化的相对顺序;它不包括何时运行包含这些成员的类的构造函数
-
@RetiredNinja 非静态数据成员应按照在类定义中声明的顺序进行初始化,最后执行构造函数体的复合语句。答案对我很有用,谢谢!
-
在代码也有
using namespace std;的情况下编写名为deque和stack的模板是很好的混淆方法,因为它们也是标准中的模板名称库(即,在命名空间std中定义)。摆脱using namespace std;。
标签: c++ constructor stl