C ++中“const int”和“int”之间有区别吗?

时间:2016-04-28 19:58:06

标签: c++ arrays integer constants

之间有什么区别:

int size = 10000;

const int size = 10000;

此代码处理数组,其中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;

3 个答案:

答案 0 :(得分:3)

区别在于&#34; const&#34;关键词。在你的第一个例子中,&#34; size&#34;不是一个常数。这允许重新定义和更改大小。但是因为这不是常量,所以也不可能将其定义为数组的大小。如果您要使用第一个示例,则无法编译。

你的第二个例子使用&#34; const&#34;关键词。一旦声明了变量,就无法更改该值。这使您可以使用它来定义数组。

也请参阅代码示例。

// Will not work because not const
int size = 10000;
int myArray[ size ];

// Will work because const
const int size = 10000;
int myArray[ size ];

答案 1 :(得分:2)

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

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

int size = 10000;

const int size2 = 10000;

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

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

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

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

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

int foo(int const &bar);

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

请注意,const也可以应用于整个class,例如const合格的成员函数:

struct foo {
    int i;

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

这基本上会将this的类型从foo * const更改为foo const * const,因此您无法在该成员函数中写入foo的任何部分(除了const抛弃mutable,你真的不应该这样做。

还有一种方法可以支持这种限制:在少数情况下,类会执行缓存(也就是记忆)值等操作。例如,如果它具有计算成本昂贵的值,则它可能在计算之后存储该值,因此如果再次请求它则不必重新计算。在这种情况下,您可以将该变量标记为const,即使通过指向const(或引用struct foo { mutable int i; int bar() const { // i = 2; // compiles without problem return 1; } }; )的指针进行访问,也可以对其进行修改。

{{1}}

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

答案 2 :(得分:1)

来自cppreference:

  

类型为const限定的对象,或const对象的不可变子对象。无法修改此类对象:尝试直接执行此操作是编译时错误,并尝试间接执行此操作(例如,通过引用或指向非const类型的指针修改const对象)会导致未定义的行为。

http://en.cppreference.com/w/cpp/language/cv

相关问题