堆栈(int = 10),这个语法是什么意思(C++)
Stack(int = 10), what does this syntax mean (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
.
请解释一下,谢谢:)
它是一个未命名的参数,默认值为 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"转换为非标量类型"堆栈"
相关文章:
- C++避免重复声明的语法是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 这行/语法是什么意思?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 将引用绑定到指针的语法是什么?(各种)
- 这个typedef和转换运算符语法是什么意思
- C++中抽象语法树最常用的表示法是什么
- 此语法是什么意思.(::*).
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 语法问题:"char [5] const &"是什么意思?
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 将此类传递给引用的正确语法是什么?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 这是什么语法: std::thread t([&] () { ... });?
- 这是什么语法?int我{10}
- 这是什么语法- new (this) T();
- 这是什么语法: "ACGT" [(int)qrand() % 4]