为什么我不能从用户那里读取值并使其成为常量?

时间:2017-10-03 18:51:39

标签: c++ const iostream

输入以下代码后,我会收到错误。

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

错误:未初始化的const&#39;数量&#39; [ - fpermissive]

     

错误:&#39;运算符&gt;&gt;&#39;

的模糊重载

如果我只使用 int

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

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

5 个答案:

答案 0 :(得分:7)

如果将变量定义为

const int quantity;

你说“我想要一个名为int的{​​{1}},在任何情况下我都不希望它的价值发生变化。”结果,如果你再写

quantity

编译器说了一些“等待 - 你希望我通过用用户输入的内容替换它来改变cin >> quantity; 的值,但早些时候你说你从来没有想过要我改变它!”

我的感觉是,你想要这样做,以便在给quantity的初始值后,该值永远不会改变,但是对于quantity变量,当变量是变量时需要设置初始值创建。因此你可以尝试这样的事情:

const

用于读取并返回const int quantity = readValue(); 值的某个函数readValue()。这样,编译器看到int被赋予固定值,它知道该值永远不会改变,并且您永远不会尝试直接quantitycin的值。

有关您所遇到的错误的更多技术观点:编译器读取时

quantity

没有赋值给它,它报告了一个错误,因为创建一个常量而不给它一个值是不常见的。 (我可以从你的代码中看到你意味着给它一个值,但你做它的方式不合法,编译器没有将这两个东西拼凑在一起)。关于const int quantity; 的第二个错误是因为您无法从operator >>读取内容(阅读字符串,阅读cin,阅读int等)。 )应用,因为他们每个人都认为他们可以获得有关价值的可变(可修改)视图。同样,这两个问题都源于这样一个事实,即编译器将您的代码视为两个独立的独立错误而不是一个大的“oops,而不是char如何工作”错误。

答案 1 :(得分:1)

您可以在声明时将const局部变量初始化一次。您的示例看起来似乎无法工作,但如果您添加一个间接级别,则很简单。

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

const int quantity = ReadAnInt();

答案 2 :(得分:0)

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

cin允许您为变量指定一个值,该变量会立即与您的const限定符相矛盾。

答案 3 :(得分:0)

您必须在声明时初始化quantity。此外,您以后不能为其分配值;毕竟,它是不变的。

答案 4 :(得分:0)

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

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