【问题标题】:Is there a difference between "const int" and "int" in C++? [closed]C ++中的“const int”和“int”有区别吗? [关闭]
【发布时间】:2016-08-23 18:57:24
【问题描述】:

两者有什么区别:

int size = 10000;

const int size = 10000;

此代码处理数组,其中大小变量名称将作为数组 [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;

【问题讨论】:

  • 你帖子里的代码还不够读者尝试编译。请设法发布minimal reproducible example
  • 我投票决定将此问题作为离题结束,因为它非常基础,可以通过简单的网络搜索“什么是 const 值”来解决。

标签: c++ arrays integer constants


【解决方案1】:

区别在于“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 关键字相同的结果,这让我感到困惑。我将在上面添加更多的代码。
  • 即使不是const,它仍然可以编译。仅当size 未使用特定值初始化时,它才会编译。这个问题是许多其他问题的重复。 OP 没有投入任何研究工作。
  • 其他帖子都没有帮助我理解为什么我的程序在我使用 const 和不使用 const 时仍然以完全相同的方式运行。
  • @tyler 然后编辑你的问题标题。您不是要求明确的区别,而是要要求“奇怪”的行为
  • @Tyler,你的程序编译是因为你不使用数组,而是动态分配内存。
【解决方案2】:

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 开始)。

【讨论】:

    【解决方案3】:

    来自 cppreference:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 2021-06-21
      • 2010-11-18
      相关资源
      最近更新 更多