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