将某些内容声明为我应该注意的size_t有什么副作用

What are any side-effects of declaring something as size_t that I should be aware of?

本文关键字:size 副作用 什么 声明 我应该      更新时间:2023-10-16

为堆栈工作制作类(代码不是我的(

我有这样的代码:

class stack {
private:
    int size;
    int* data;
    // what next line mean?
    size_t ptr;
    public:

stack(int valid_stack_size) {
    this->size = valid_stack_size;
    this->ptr = 0;
    this->data = new int[valid_stack_size];
}
void push(int value) {
    if (this->ptr >= (size_t)this->size)
        cout << "Stack is full" << endl;
    this->data[this->ptr++] = value;
}
int pop() {
    if (this->ptr == 0)
        cout << "Stack is empty" << endl;
    return this->data[--this->ptr];
}

};

PTR size_t是什么意思? size_t取 PTR 值?还是?

size_t是一种类型 - 在头文件cstddef中定义为可以容纳对象最大大小的类型。在现代系统上,它通常与指针的大小相等,这通常是 64 位(8 字节(。但是,标准没有要求这样做。

结果,这一行声明了类型 size_t 的变量ptr,这令人困惑 - ptr作为名称表明变量类型应该是一个指针。

附带说明一下,此代码表现出未定义的行为 - 在空堆栈上弹出或推送到完整堆栈时。

size_t是实现定义的无符号整数类型。

例如,可以通过以下方式定义size_t

typedef unsigned long size_t;

也就是说,根据此定义size_tunsigned long类型的别名。

来自C标准(7.19通用定义<stddef.h>(

size_t 这是 sizeof 运算符结果的无符号整数类型;

或者在C++标准中写着(18.2种类型(

6 size_t类型是实现定义的无符号整数类型 它足够大,可以包含任何对象的大小(以字节为单位(。

C++size_t的定义(在标头<cstddef>中声明(也放在命名空间std中。所以你也可以写

std::size_t ptr;

因此这行代码

size_t ptr;

表示标识符ptr的声明,该声明将堆栈中的当前位置确定为具有类型size_t,而该类型又通常定义为unsigned long int

至于你显示的代码,那么名称ptr对于标量整数对象来说不是很好。例如,最好将其命名为pos("位置"一词的缩写(