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

C++中的“const int”和“int”之间有什么区别吗?,c++,arrays,integer,constants,C++,Arrays,Integer,Constants,以下两者之间有什么区别吗 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

以下两者之间有什么区别吗

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关键字。在第一个示例中,大小不是常数。这允许重新定义和更改大小。但由于这不是一个常数,因此也不可能将其定义为数组的大小。如果使用第一个示例,它将无法编译

第二个示例使用const关键字。一旦声明了变量,就不能更改该值。这使得您可以使用它来定义一个数组

请参见代码示例

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

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

const在C++中有很多效果。 第一个也是最明显的是,它意味着一个值是只读的。稍微扩展一下您的示例:

int size = 10000;

const int size2 = 10000;

int main() { 
    size = 1; // fine
    size2 = 2; // won't compile
}
在本例中,这意味着size2实际上是一个常数。C++标准有一些特殊的语言,允许编译器消除一个const限定变量,只要把它当作一个值,只要你用它不需要它有地址的方式。

另一个效果是,const限定值有可能用作常量表达式,因此它可以用在非常量表达式不能使用的一些方法中,例如定义数组的大小,但注意,无论如何,在C++中很少使用数组:STD::向量通常是首选的。

C++中的另一个效果,但不是C,是定义变量作为const也使它静态,因此在您的变量看来是在任何函数之外定义的,不合格变量是全局的,所以它可以从另一个翻译单元源文件中看到,并有适当的外部声明。无法创建常量变量

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

int foo(int const &bar);
…foo内部的代码无法写入bar引用的任何内容,但bar可以绑定到非常量变量,因此直接引用它的其他代码可以修改它。给定多线程,foo中的代码甚至可以从bar读取两个或多个不同的值,即使foo中的代码不能修改bar本身

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

struct foo {
    int i;

    int bar() const {
        // i = 2; // won't compile
        return 1;
    }
};
这基本上将其类型从foo*const更改为foo-const*const,因此您不能在该成员函数中写入foo的任何部分,除非丢弃const,这是您真正不应该做的

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

1.请注意,一些编译器,特别是gcc,有一个扩展,允许您定义大小不是常量的非全局数组,因此这可能是一个有点误导的标准。虽然这是C++中的扩展,但它是C99的C的标准部分。
我的程序仍然编译并产生相同的结果,就像我使用const关键字一样,这让我感到困惑。我将在上面添加更多的代码。即使它不是常量,它仍然可以编译。只有当size没有用某个值初始化时,它才不会编译。这是一个问题,是许多其他问题的重复。OP没有做任何研究工作。其他帖子都没有帮助我理解为什么我的程序在使用const和不使用const时仍然以完全相同的方式运行。@tyler然后编辑你的问题标题。你不是在要求明确的区别,你会想要一个wierdbehavior@Tyler,您的程序可以编译,因为您不使用数组,而是动态分配内存。您文章中的代码不足以让读者尝试编译。请设法发布一篇“我正在投票”来结束这个问题,因为这是一个非常基本的问题,可以通过一个简单的web搜索来解决。
struct foo {
    int i;

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

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