宣布像size_t这样我应该注意的东西有什么副作用?

时间:2016-11-10 16:38:12

标签: c++ visual-c++

使用堆栈进行工作(代码不是我的)

我有这样的代码:

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];

}



};

size_t ptr是什么意思? size_t需要ptr值吗?或?

2 个答案:

答案 0 :(得分:2)

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

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

在旁注中,此代码显示未定义的行为 - 在空堆栈上弹出或推入完整的代码时。

答案 1 :(得分:2)

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对于标量整数对象不是很好。最好将它命名为例如{{1}}(单词“position”的缩写)