为什么我不能从用户那里读取一个值并将其设为常量?

Why can't I read a value from the user and make it a constant?

输入以下代码后,出现错误

const int quantity;
cout << "How much spacing do you want in-between the frames? " ;
cin >> quantity;

error: uninitialised const 'quantity'[-fpermissive]

error: ambiguous overload for 'operator>>'

如果我只使用 int

类型就不会发生这种情况
int quantity;
cout << "How much spacing do you want in-between the frames? " ;
cin >> quantity;

编译没有问题。我是 C++ 新手,所以我只想知道这是为什么。

const 限定符表示变量是不可变的,您不能更改它的值。第一个错误告诉您变量未初始化。

cin 允许您为变量赋值,这立即与您的 const 限定符相矛盾。

您必须在声明时初始化 quantity。此外,你以后不能给它赋值;毕竟是常态

如果将变量定义为

const int quantity;

你说的是 "I'd like an int called quantity, and under no circumstances do I want its value to ever change." 结果,如果你再写

cin >> quantity;

编译器说的是 "wait - you want me to change the value of quantity by replacing it with whatever the user entered, but earlier you said that you never wanted me to change it!"

我的感觉是你想做的是在你给 quantity 一个初始值之后,这个值永远不会改变,但是对于 const 变量,初始值需要在变量被创建。因此你可以尝试这样的事情:

const int quantity = readValue();

某些函数 readValue() 读取 returns 一个 int 值。这样,编译器看到 quantity 被赋予了一个固定值,它知道这个值永远不会改变,你永远不会尝试直接 cin 变成 quantity.[=29 的值=]

要从更技术的角度了解您遇到的错误:当编译器读取时

const int quantity;

没有给它赋值,它报告了一个错误,因为创建一个常量而不给它一个值是不寻常的。 (我可以从你的代码中看出你 的意思是 给它一个值,但是你这样做的方式是不合法的,编译器没有把这两件事拼凑在一起)。关于 operator >> 的第二个错误是因为 none 您可以从 cin 中读取内容的不同方式(读取字符串、读取 int、读取 char, 等) 应用, 因为他们每个人都假设他们可以获得所讨论值的可变 (可修改) 视图。同样,这两个问题都源于这样一个事实,即编译器将您的代码视为两个独立的独立错误,而不是一个大的 "oops, that's not how const works" 错误。

您只能在声明时初始化一个 const 局部变量一次。你的例子看起来不可能工作,但如果你添加一个间接级别就很简单了。

int ReadAnInt()
{
    int temp;
    cin >> temp;
    return temp;
}

const int quantity = ReadAnInt();

首先,您在两个框中输入相同的代码。 我承认你把 const 符号放在第一个来源中。 其次,必须在 C++ 声明时初始化 const。 因此你应该把代码如下

 int value;
 cin >> value;
 const int my_num = value;