【问题标题】:Stack(int = 10), what does this syntax mean (C++)?Stack(int = 10),这个语法是什么意思(C++)?
【发布时间】:2014-02-09 15:44:07
【问题描述】:
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

请解释一下,谢谢:)

【问题讨论】:

标签: c++


【解决方案1】:

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

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

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

注意事项:它是默认构造函数的声明,因为它可以不带参数调用。

【讨论】:

  • 老实说从未遇到过。不能用有什么用?
  • @DavidKernin 如果你在函数的定义中给它一个名字就可以使用它。
  • @DavidKernin Tag dispatching,例如。不命名它可以避免关于未使用参数的编译器警告。此外,隐藏实现细节,保留参数以供将来使用等......
  • @DavidKernin 也向后兼容。有时一个参数变得未使用,您不想触发“参数未使用”警告。删除名称可以防止这些。
  • 感谢您的基本回答。 :)
【解决方案2】:

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

struct X {
  X(int = 10) {  }
};

void foo(X) {}

int main()
{
  X x1; // works
  X x2 = 23; // works
  foo(20); // works

  return 0;
}

这似乎不适合堆栈,您应该在构造函数中添加 explicit 关键字。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      Stack<int> dd = 0;
      

      或:

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

      为了避免将你的构造函数更改为explicit:

      explicit Stack( int = 10 );
      

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

      错误:请求从“int”转换为非标量类型“Stack”

      【讨论】:

        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 2022-11-13
        • 2021-05-12
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        相关资源
        最近更新 更多