Stack(int = 10),这个语法是什么意思(C ++)?

时间:2014-02-09 15:44:07

标签: c++

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

请解释,谢谢:)

4 个答案:

答案 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'请求