template <typename Type>
class Stack
{
private:
int stack_size;
int array_capacity;
Type *array;
public:
Stack( int = 10 ); //??
~Stack();
bool empty() const;
Type top() const;
void push( const Type & );
Type pop();
};
template <typename Type>
Stack<Type>::Stack( int n ) :
stack_size( 0 ),
array_capacity( std::max(0, n) ),
array( new Type[array_capacity] )
{
// Empty constructor
}
这是使用单端数组的堆栈实现,但是代码的位使我感到困惑。
我不明白为什么会说int = 10
。
请解释,谢谢:)
答案 0 :(得分:12)
这是一个未命名的参数,默认值为10.
您不需要在函数声明中命名参数 - 所有编译器都关心的是参数的类型和数量。
在定义中,如果您想在身体内使用参数,则需要名称。
Nota bene :这是默认构造函数的声明,因为它可以不带参数调用。
答案 1 :(得分:5)
这为构造函数的第一个参数提供了一个默认值。这也使得类可以默认构造并且可以从int
隐式转换。这可能会产生一些令人惊讶的效果。
struct X {
X(int = 10) { }
};
void foo(X) {}
int main()
{
X x1; // works
X x2 = 23; // works
foo(20); // works
return 0;
}
对于堆栈而言,这似乎是不合需要的,您应该将explicit
关键字添加到构造函数中。
答案 2 :(得分:2)
这是默认参数。你可以使用或不使用参数调用构造函数。如果未指定参数,则其值为10.
答案 3 :(得分:1)
Stack(int = 10); // ...
10只是参数的默认值,如果在构造函数调用期间未提供参数,则会将其分配给参数。
编译器允许您不在定义中为参数命名,这并不意味着它是一个好习惯。定义主要用于关于给定函数/构造函数正在做什么的附加注释,它们也与名称给定的参数相关,因此在定义中选择未命名的参数实际上是不好的做法。
此外,你的构造函数将允许你做愚蠢的事情,如:
Stack<int> dd = 0;
或:
void fun(const Stack<int>& d) {}
fun(0);
使得无法将构造函数更改为explicit
:
explicit Stack( int = 10 );
这将导致编译器为早期语句生成错误:
错误:从'int'转换为非标量类型'Stack'请求