两者之间有什么区别吗
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;
//...
}
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
可以绑定到非常量变量,因此直接引用它的其他代码可以修改它。考虑到多线程,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. 请注意,某些编译器(尤其是 gcc)有一个扩展,允许您定义大小不是常量的非全局数组,因此这可能是一个有点误导的标准。虽然这是 C++ 中的扩展,但它是 C 的标准部分(从 C99 开始)。
区别在于“const”关键字。在您的第一个示例中,“大小”不是常量。这允许重新定义和更改尺寸。但因为这不是一个常量,所以也不可能将其定义为数组的大小。如果您要使用第一个示例,它将无法编译。
您的第二个示例使用“const”关键字。一旦声明了变量,其值就无法更改。这使您可以使用它来定义数组。
另请参阅代码示例。
// Will not work because not const
int size = 10000;
int myArray[ size ];
// Will work because const
const int size = 10000;
int myArray[ size ];
来自 cppreference:
类型为 const 限定的对象,或 const 对象的不可变子对象。此类对象无法修改:尝试直接这样做会导致编译时错误,而尝试间接这样做(例如,通过指向非常量类型的引用或指针修改 const 对象)会导致未定义的行为。