C++ 在函数中声明常量而不是变量有什么好处吗?

C++ 在函数中声明常量而不是变量有什么好处吗?,c++,variables,constants,C++,Variables,Constants,如果我有一个只存在很短时间的函数,那么将颜色列表设置为常量是否会产生影响 string getrandcolor(){ const string colors[5] = {"red", "blue", "green", "yellow", "purple"}; return colors[rand() % 5]; } 注意:实际的颜色列表包含数百种颜色,不仅仅是我展示的小样本,也不确定这是否会产生差异。如果您谈论的是性能,那么:不,它不应该产生任何差异。它可以防止您意外地覆盖不

如果我有一个只存在很短时间的函数,那么将颜色列表设置为常量是否会产生影响

string getrandcolor(){
    const string colors[5] = {"red", "blue", "green", "yellow", "purple"};
    return colors[rand() % 5];
}

注意:实际的颜色列表包含数百种颜色,不仅仅是我展示的小样本,也不确定这是否会产生差异。

如果您谈论的是性能,那么:,它不应该产生任何差异。

它可以防止您意外地覆盖不想更改的变量。“Oops!”-保护可能是
const
最重要的功能

假设一个编译器可以通过知道一个变量不应该改变来预测某种优化,但是我的测试从来没有发现一个在您描述的情况下确实能做一些有意义的事情


const在您的特定代码示例中确实有一个重要的区别。因为您的colors[]数组是本地的,所以每次调用
getrandcolor()
函数时都必须重新构造它。这意味着每次调用
getrandcolor()
,字符串构造函数都会运行五次,这是非常浪费的。conststatic表示数据只构造一次(函数第一次运行时),并放入共享内存空间

通过将局部变量声明为常量,您可以获得以下好处:

  • 正确性:编译器将确保您不会意外更改变量的值
  • 清晰性:清楚地记录变量是常数

(顺便说一句,我不确定在那个具体的例子中什么是常量。稍后…

在性能方面?不,可能不会。看起来您的数组也可能是静态的,然后可能是

在代码风格方面?可能地虽然添加了
const
使代码有点冗长,但它也清楚地表明数据是不可修改的。这既是记录,也是安全的



理想情况下,C++中的所有对象默认为常数,而必须编写<代码>可更改的< /C> >以使它们成为变量。一切都是倒退

谈到性能和代码可读性,您应该在初始化函数或全局级别创建函数外部的“colors”变量(因为100大小的数组包含大量代码,掩盖了函数的逻辑)。 如果你不考虑提取这个变量,至少让它变静态。

如果这个数组只在程序执行期间的短时间内使用,您可以考虑在第一次调用之前将其填充到GETFICE中,并在您确信不再需要它时最终释放它。p> 稍有不同的示例:

const int *global_ptr = 0;

void bar();

void foo() {
    int x = 1;
    global_ptr = &x;
    bar();
    std::cout << x << "\n";
}
const int*global\u ptr=0;
空心钢筋();
void foo(){
int x=1;
全局_ptr=&x;
bar();

std::你能经常调用这个函数吗?@Tommy:字符串在返回时被复制,因为它是按值返回的。@Cameron:哎呀,不知什么原因,我以为他在返回指针。@Cameron很难说,它可能被多次调用,也可能被称为无,这取决于用户在做什么。
static可能比这里提到的const有更大的影响,所以+1。“它必须重新构造”我不确定这是真的。可能是真的,但我不认为“它必须”是准确的。这真的很有趣,谢谢,但是如果我有一个函数A和另一个变量X,函数B和另一个变量X,它们都是相同的类型,但应该是不同的,它们会相互继承数据吗?@标记否,函数中的静态局部变量只在其中可见函数。它们是“局部范围的”您可以在这里了解更多关于静态局部变量的信息:以及从函数返回它们的含义:字符串是常量。
colors
是一个由5个常量字符串组成的
左值数组。
我刚刚检查过:)没有,因为您无法分配给数组。这就是停止使用语言时发生的情况我总是忘记基本知识。“理想情况下,C++中的所有变量都默认为const”——让我们来考虑一下:-----)PaxDabLo:对象。“理想情况下,C++中的所有变量都默认为const。”闭嘴。理想情况下,默认情况下所有名称都引用常量对象,并且需要使用某些关键字来指示可变引用