C++ 中“const int”和“int”有区别吗? [已关闭]

问题描述 投票:0回答:3

两者之间有什么区别吗

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;
    //...
}
c++ arrays integer constants
3个回答
6
投票

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


4
投票

区别在于“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 ];

2
投票

来自 cppreference:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.