Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c++;用户输入数据的常数?_C++_Constants - Fatal编程技术网

C++ 使用c++;用户输入数据的常数?

C++ 使用c++;用户输入数据的常数?,c++,constants,C++,Constants,假设我想从cin中读取一个整数,然后使其不可变。我可以做到: int a; cin >> a; const int b = a; 然后,我将有一个变量(b),它被初始化为用户数据,但不能更改。然而,我认为我在这里滥用了const关键字。这样做可以接受吗?编译器似乎还可以,但我只是想知道从风格的角度看它是否正确。完全可以。您可以自由地从非常量数据创建常量变量,甚至是用户输入的数据 您甚至可以编写一个函数,这样以后就不会有一个变量出现。例如: int read_int(std::ist

假设我想从cin中读取一个整数,然后使其不可变。我可以做到:

int a;
cin >> a;
const int b = a;

然后,我将有一个变量(b),它被初始化为用户数据,但不能更改。然而,我认为我在这里滥用了const关键字。这样做可以接受吗?编译器似乎还可以,但我只是想知道从风格的角度看它是否正确。

完全可以。您可以自由地从非常量数据创建常量变量,甚至是用户输入的数据

您甚至可以编写一个函数,这样以后就不会有一个变量出现。例如:

int read_int(std::istream& in) {
  int a;
  in >> a;
  return a;
}

int const b = read_int(std::cin);

很好。您可以确信,在运行程序的上下文中,“b”的值永远不会改变。

这是一个哲学问题。:)


在我看来,你没有做任何风格上的偏差。您定义了一个变量,该变量从此点起不再改变。该变量值的历史记录可以忽略不计。:)

虽然我同意Rob&David的观点,但在可能的情况下,最好将
b
作为参考:

int a;
cin >> a;
const int &b = a;

虽然对于int,您可能不会节省太多,但是对于较大的对象,您可以节省复制、调用和内存。

是的。这就是关键字的作用。这不仅仅是可以接受的,它是一种语言特性的应用。你为什么担心呢?没有什么特别的问题,但我认为这是毫无意义的,因为
b
不是编译时已知的常数,是局部的,只是一个
int
。这很好。当你开始输入volatile时,你需要“在…之前检查你自己”@Matteo,这并不是毫无意义的。我甚至认为,在不希望变量改变的情况下,标记变量const是明智的。这样,如果您不小心试图误用它们,编译器将捕获您并阻止它。否则,只有在编译、运行和测试程序并注意到出错后,您才会注意到错误。最简单的调试是你不必做的调试,因为从一开始就没有bug。我发现这种做法唯一危险的地方是嵌入式系统,有些编译器倾向于让预编译器盲目地运行
const
s,就好像它们是
#定义
s一样。使用a可以执行
const int b=({int a;std::cin>>a;a;})(当然在C++0x中有lambdas:
constintc=[]()->int{inta;std::cin>>a;返回a;}();