在课堂上说:
class X
{
int _top;
vector<int> _stack;
public:
X() { } // SOME CONSTRUCTOR
};
为什么这种形式的构造函数有效:
X( int capacity )
: _stack( capacity ), _top( 0 ) { }
但这些不起作用:
1
X( int capacity )
{ _stack( capacity ); _top=0; }
2
X( int capacity )
{_stack = capacity; _top=0;}
请解释。
答案 0 :(得分:4)
第一个可行,因为您在初始化列表中初始化_stack
,而第二个表单不使用初始化列表。
阅读此代码中的注释,以了解什么是初始化列表!
struct sample
{
int a,b,c;
vector<int> _stack;
sample(int capacity) : _stack(capacity), a(1), b(10), c(100) {}
// ^^^^^^^^^^^^^^^^^^^^^ this is called initialization list
sample(int capacity, int x)
{
_stack(capacity); //wrong!
a = b = c = x; // this is called assignment
//here, inside the constructor body you cannot
//initialize member variables, because members has been
//constructed and initialized already by the time executions comes here!
}
};
基本上,语法_stack(capacity)
调用构造函数。只有在构造对象时才能调用构造函数。构造对象后,您无法调用构造函数。在第二种形式中,您尝试通过在构造函数体中编写_stack(capacity)
来调用构造函数,但到那时_stack
已经构造,这就是您的代码不起作用的原因!
有关初始化列表的详细信息,请阅读以下常见问题解答:
[10.6] Should my constructors use "initialization lists" or "assignment"?
答案 1 :(得分:2)
在第一种形式中,您调用构造函数,但不是第二种和第三种形式。
在1
,您正在调用vector<T>::operator ()(int)
,vector<T>
未定义。
在2
中,您被分配了int
到vector<T>
,但未定义。
另请注意,std::vector<int>(size_t n)
构造函数不仅保留内存,而是使用n
零填充向量。如果您需要设置容量而不实际向向量添加任何值,请调用vector<T>::reserve(size_t)
。
如果这不是通过vector
实现堆栈的目标,那么std::stack
容器适配器已经可以在标准库中使用。
stack<int> myStack;
或
stack<int, vector<int> > myVectorBasedStack;
答案 2 :(得分:1)
此表单有效,因为它调用类成员的构造函数。
X( int capacity )
: _stack( capacity ), //calls vector(int) constructor
_top( 0 ) // calls int(int) constuctor
{ }
1.这不起作用,因为只要你在构造函数体内,就应该使用其他语法调用构造函数。
X( int capacity )
{
_stack( capacity ); //this is not a constuctor call. But this is vector operator()(int) call. And vector does not have this operator defined.
//the proper constructor call in this place would be _stack = vector<int>( capacity );
_top=0;
}
您可能已将此与缩写形式的声明和构造函数调用混淆。如果你将_stack声明为vector并在同一时间初始化你可以写:
vector<int> _stack( capacity );
但这只是一个简短形式:
vector<int> _stack = vector<int>( capacity );
2.这是错误的,显然是因为你不能只将整数赋给向量
X( int capacity ){ _stack = capacity; _top=0; }
答案 3 :(得分:0)
工作表单使用向量的构造函数 - 这在初始化列表中是允许的。
第一个非工作看起来像你试图显式调用向量构造函数 - 这是不允许的,已经构造了向量。初始化列表允许您使用显式构造函数调用替换超类和成员变量的默认构造。
第三个不起作用因为vector没有实现一个赋值为int的赋值运算符。它可以修改为_stack.resize(capacity)