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

Stack(int = 10), what does this syntax mean (C++)?

本文关键字:是什么 语法 意思 C++ int 堆栈      更新时间:2023-10-16
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.

请解释一下,谢谢:)

它是一个未命名的参数,默认值为 10。

您不需要在函数声明时命名参数 - 编译器关心的只是参数的类型和数量。

定义中,如果您希望在正文中使用参数,则需要名称。

注意:它是默认构造函数的声明,因为它可以在没有参数的情况下调用。

这为构造函数的第一个参数提供了默认值。这也使得类默认可构造,并且可以从 int 隐式转换。这可能会产生一些令人惊讶的效果。

struct X {
  X(int = 10) {  }
};
void foo(X) {}
int main()
{
  X x1; // works
  X x2 = 23; // works
  foo(20); // works
  return 0;
}

这对于堆栈来说似乎是不可取的,您应该将 explicit 关键字添加到构造函数中。

这是一个默认参数。 可以使用或不带参数调用构造函数。如果不指定参数,则其值将为 10。

堆栈( int = 10 );//??

10 只是参数的默认值,如果在构造函数调用期间未提供,它将被分配给您的参数。

编译器允许您在定义中不为参数命名这一事实并不意味着这是一种好的做法。定义主要与有关给定函数/构造函数正在做什么的附加注释一起使用,它们也通过名称与给定参数相关,因此在定义中选择未命名参数实际上是不好的做法。

此外,您的构造函数将允许您做一些愚蠢的事情,例如:

Stack<int> dd = 0;

或:

void fun(const Stack<int>& d) {}
fun(0);    

要使其无法将构造函数更改为explicit

explicit Stack( int = 10 );

这将导致编译器为前面的语句生成错误:

错误:请求从"int"转换为非标量类型"堆栈"