数组声明中的“const int”和“int”有区别吗?

Tee*_*eej -5 c++ arrays integer constants

之间有什么区别:

int size = 10000;
Run Code Online (Sandbox Code Playgroud)

const int size = 10000;
Run Code Online (Sandbox Code Playgroud)

此代码处理数组,其中size变量名称将作为 进入数组array[size]

我如何在我的代码中使用它:

int main() {
    int size = 50000; // here is where I had const before
    int * items;
    items = new int [size];
    
    //random array for bubbleSort
    for (int i = 0; i < size; i++) {
        items[i] = rand();
    }
    
    clock_t start, end;
    assert((start = clock()) != -1);
    sort1(items, size); //bubbleSort
    end = clock();
    cout << "bubbleSort(random): " << (double)(end - start)/CLOCKS_PER_SEC << " seconds" << endl;
    //...
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 6

const在 C++ 中有许多影响。

第一个也是最明显的是,它意味着值是只读的。稍微扩展一下你的例子:

int size = 10000;

const int size2 = 10000;

int main() { 
    size = 1; // fine
    size2 = 2; // won't compile
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这意味着size2确实是一个常数。C++ 标准有一些特殊的语言,允许编译器消除 -const限定的变量,并将其视为一个值,只要您仅以不需要它有地址的方式使用它。

另一个效果是 const 限定值有可能用作常量表达式,因此它可以以非常量表达式不能的几种方式使用,例如定义数组1的大小(但请注意无论如何,你很少想在 C++ 中使用数组——std::vector通常是首选)。

另一个效果(在 C++ 中,但不是 C)是定义一个变量也const使得它static,所以在你的情况下(变量似乎是在任何函数之外定义的)非限定变量是全局的,所以可以从另一个翻译单元看到它(源文件)带有适当的extern声明。该const变量不可能是。

请注意,当const通过指针或引用应用时,它实际上意味着“只读”,而不是“常量”。例如,给定一个如下函数:

int foo(int const &bar);
Run Code Online (Sandbox Code Playgroud)

...内部的代码foo无法写入所bar引用的任何内容, bar可以绑定到非常量变量,因此直接引用它的其他代码可以修改它。考虑到多线程,内部的代码甚至可以foo从 读取两个(或更多)不同的值bar,即使该代码foo无法修改bar自身。

请注意,const也可以应用于整个class,例如在const- 限定的成员函数中:

struct foo {
    int i;

    int bar() const {
        // i = 2; // won't compile
        return 1;
    }
};
Run Code Online (Sandbox Code Playgroud)

this这基本上改变了from foo * constto的类型foo const * const,因此您不能写入foo该成员函数中的任何部分(除非抛弃const,您确实不应该这样做)。

还有一种方法可以绕过该限制:在某些情况下,类会执行诸如缓存(也称为记忆)值之类的操作。例如,如果它有一个计算成本很高的值,它可能会在计算后存储该值,因此如果再次请求它,则不必重新计算。在这种情况下,您可以将该变量标记为mutable,这样即使通过指向const(或引用const)的指针访问它,也可以对其进行修改。

struct foo {
    mutable int i;

    int bar() const {
        // i = 2; // compiles without problem
        return 1;
    }
};
Run Code Online (Sandbox Code Playgroud)

1. 请注意,某些编译器(尤其是 gcc)有一个扩展,允许您定义大小不是常量的非全局数组,因此这可能是一个有点误导的标准。虽然这是 C++ 中的扩展,但它是 C 的标准部分(从 C99 开始)。