为什么我不能从用户那里读取值并使其成为常量?
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;
错误:未初始化的常量"数量"[-允许]
错误:"运算符>>"的重载不明确
如果我只使用int类型,则不会发生这种情况
int quantity;
cout << "How much spacing do you want in-between the frames? " ;
cin >> quantity;
编译没有问题。我是C++新手,所以我只想知道为什么会这样。
如果将变量定义为
const int quantity;
你说"我想要一个叫quantity
的int
,在任何情况下我都不希望它的价值改变。结果,如果你然后写
cin >> quantity;
编译器说了一些话,大意是"等等 - 您希望我通过将quantity
的值替换为用户输入的任何内容来更改它,但早些时候您说您从不希望我更改它!
我的感觉是,您希望在为quantity
提供初始值后,该值永远不会更改,但是对于const
变量,需要在创建变量时设置初始值。因此,您可以尝试这样的事情:
const int quantity = readValue();
对于某些读取并返回int
值的函数readValue()
。这样,编译器可以看到quantity
被赋予了一个固定值,它知道该值永远不会改变,并且您永远不会尝试直接cin
quantity
的值。
有关您得到的错误的更多技术观点:当编译器读取
const int quantity;
在没有为其分配任何值的情况下,它报告了一个错误,因为在不给它一个值的情况下创建一个常量是不寻常的。(我从你的代码中可以看出,你的意思是给它一个值,但你这样做的方式是不合法的,编译器也没有把这两件事拼凑在一起)。关于operator >>
的第二个错误是因为从cin
读取某些内容的不同方法(读取字符串、读取int
、读取char
等)都没有应用,因为它们中的每一个都假设他们可以获得相关值的可变(可修改)视图。同样,这两个问题都源于这样一个事实,即编译器将你的代码视为两个独立的错误,而不是一个大的"哎呀,这不是const
工作方式"的错误。
您只能在声明const
局部变量时初始化一次。您的示例看起来不可能工作,但如果添加间接级别,则很简单。
int ReadAnInt()
{
int temp;
cin >> temp;
return temp;
}
const int quantity = ReadAnInt();
const
限定符意味着变量是不可变的,您无法更改其值。第一个错误告诉您变量未初始化。
cin
允许您为变量赋值,这立即与const
限定符相矛盾。
您必须在声明quantity
初始化它。此外,您以后无法为其赋值;毕竟,它是恒定的。
首先,您将相同的代码放入两个框中。 我承认你把const
符号放在第一个来源中。 其次,const
必须在C++的声明中初始化。 因此,您应该将代码放如下
int value;
cin >> value;
const int my_num = value;
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 为什么不能用常量表达式声明数组?
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 生成 constexpr 字符串表,不能产生常量表达式
- 为什么C++编译器不能做更好的常量折叠?
- 为什么右值不能绑定到非常量左值引用,除了写入临时无效的事实?
- 错误:'new'不能出现在常量表达式中
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 不能(隐式地)从字符**转换为常量字符**吗?
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 为什么我不能使用与"常量字符*"相同的"const int*"创建一个 int 数组?
- 为什么我不能将 op 结果乘以常量特征张量数组
- 为什么我不能将 2 个常量字符* 连接到 std::string?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 为什么我们不能在声明之前使用预处理器 #define 常量