C中的“const int”和“int”有区别吗?

新手上路,请多包涵

有什么区别:

 int size = 10000;

const int size = 10000;

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

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

 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;

原文由 Teej 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
1 个回答

const 在 C++ 中有很多效果。

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

 int size = 10000;

const int size2 = 10000;

int main() {
    size = 1; // fine
    size2 = 2; // won't compile
}

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

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

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

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

 int foo(int const &bar);

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

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

 struct foo {
    int i;

    int bar() const {
        // i = 2; // won't compile
        return 1;
    }
};

This basically changes the type of this from foo * const to foo const * const , so you can’t write to any part of foo in that member功能(除了抛弃 const ,你真的不应该这样做)。

还有一种方法可以绕过这个限制:在少数情况下,一个类会做一些事情,比如缓存(也就是记忆)一个值。例如,如果它有一个计算成本很高的值,它可能会在计算后存储该值,因此如果再次请求它就不必重新计算。在这种情况下,您可以将该变量标记为 mutable ,即使通过指向 const 的指针(或引用 const )访问它也可以修改它.

 struct foo {
    mutable int i;

    int bar() const {
        // i = 2; // compiles without problem
        return 1;
    }
};


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

原文由 Jerry Coffin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题