C++ 常量(c+;+;)是可选的吗?
根据我不久前阅读的一些教程,“const”声明生成一个变量“常量”,即以后不能更改。C++ 常量(c+;+;)是可选的吗?,c++,constants,C++,Constants,根据我不久前阅读的一些教程,“const”声明生成一个变量“常量”,即以后不能更改。 但是我发现这个常量声明有点不方便,因为编译器有时会给出类似 “无法将常量int转换为int” 或者类似的 不管怎样,我发现自己通过移除它来作弊 问题: 假设我很小心不要更改源代码中的变量,我能愉快地忘记这个常量吗 提前感谢您可以忘记它,但是如果编译器强制您使用它,这不是很好吗?这样,你的“常量”变量实际上保持不变。你是认真的吗?为什么你会因为有时犯错误而放弃这样一个有用的特性呢?最好尝试并学会避免使用const
但是我发现这个常量声明有点不方便,因为编译器有时会给出类似
“无法将常量int转换为int”
或者类似的 不管怎样,我发现自己通过移除它来作弊 问题: 假设我很小心不要更改源代码中的变量,我能愉快地忘记这个常量吗
提前感谢您可以忘记它,但是如果编译器强制您使用它,这不是很好吗?这样,你的“常量”变量实际上保持不变。你是认真的吗?为什么你会因为有时犯错误而放弃这样一个有用的特性呢?最好尝试并学会避免使用
const
时出错,这样您就可以从它为确保代码正确性而添加的巨大帮助中获益
当然,您可以对该语言提供的所有帮助说再见,并告诉编译器,从而不再告诉您代码中的错误。相反,您以后必须询问调试器您的bug在哪里。不知道这样是否更好 如果你小心的话,是的。但犯错是人之常情。此外,您没有给编译器提供围绕这些常量进行优化的机会 您收到的错误消息是因为您试图更改
常量int
。只需将该值赋给(非常量)int
,您就可以根据需要对其进行更改
Const可以帮助您,尝试在周围散布更多的内容,并听取编译器的意见。这将帮助您生成更好的代码。它总是可选的。如果这都是您的代码,那么您肯定可以忘记它(我不建议这样做,因为它可以保护您),但是当您与其他人交互时,您实际上是在为他们提供一个契约,即您不会更改他们的对象,或者调用一个函数不会更改对象的状态。当您不熟悉其他人的代码,或者您没有源代码时,这可能非常宝贵。即使您和您的同事从不出错,在方法声明中使用const有助于记录您的接口。使用“const”背后的思想是,当您不想更改预先确定的变量值时(通过使用
const
),在尝试更改该变量值时,确保编译器出错。它本质上是内置的错误检查,出于许多原因非常有用
这在诸如外部接口和公共方法之类的情况下尤其有价值,可以保证调用方不会修改传递的值
const
还锁定不修改的意图,并防止意外分配
虽然强制使用const
是不必要的,但这是非常有用的好做法
这是一个有用的解释,你可以检查一下:
C++,“const”可以应用于变量(使它不变)或函数(使它不能改变其他事物)。
我使用“const”不仅仅是为了防止代码更改变量。这是为了防止某些白痴的代码更改我的变量(特别是如果六个月后的白痴就是我),以及防止我的代码更改某些白痴留下的关键变量(特别是如果六个月前的白痴就是我)。更改不应该更改的内容是最常见的错误源之一。 因此,指定const是值得的,因为它可以防止您做错事。你为什么要放弃呢
const double PI = 3.14159265358979;
PI=4; // generates a compiler error (good)
< > C++符号有一些问题,因为常数只能初始化,没有被第一次赋值,有时在初始化时没有值。
class A {
private:
const int num;
public:
A(int x, int y) : num(0) { // oops, I don't yet know what num should be
while ( ... ) {
}
num = ...;
}
};
解决这个问题的方法是定义一个私有函数来计算num的值
但有时这意味着,不是构造函数中的一个干净的代码块,而是被迫以笨拙的方式将其拆分为多个部分,以便初始化变量
class A {
private:
const int num;
int computeNum(int x, int y) { ... }
public:
A(int x, int y) : num(f(x,y)) {
}
};
有时,您有一个通常被认为是const的值,但当它在语义上有意义时,您希望有选择地覆盖它。例如,社会保险号码不会改变,除非你的身份被偷。因此,您只有一个名为createNewSSN()的方法,它可以更改其他常量ssn
class Person {
private:
const int ssn;
public:
Person(int ssn_) : ssn(ssn_) {}
void createNewSSN(int newssn) {
log << "Changed SSN: " << ssn << " to " << newssn << "\n";
*(int*)&ssn = newssn; // trust me, this is a special case....
}
};
班级人员{
私人:
const int ssn;
公众:
个人(内部ssn):ssn(ssn){
void createnewsn(int newsn){
记录以首先回答您的问题:
是的,你可以。但前提是你要小心,从现在到永远使用你的代码的其他人也要小心
所以,总的来说,你最好考虑一下为什么你应该做一些const
,什么时候不应该做
另一种探索const产生差异的方法是,首先尝试使所有内容都是const,直到您有足够的理由更改某些内容,然后,并且只有到那时,才删除最小数量的const,直到它再次工作
很高兴看到您正在考虑这个问题-这比大多数人都要多。如果没有const,您将失去一些有用的语言功能,特别是关于引用的功能。请考虑:
void f(const MyClass& m);
void f(const int& i);
// ...
f(MyClass()); // OK, can pass temporary as const reference
f(5); // OK as well, 5 is a temporary int
如果你认为“const”是可选的,并去掉它:
void f(MyClass& m);
void f(int& i);
// ...
f(MyClass()); // Error, cannot pass temporary as non-const reference
f(5); // Error, same as above
当人们开始使用const关键字时,通常会遇到这个问题。相信我,这真的很有帮助。让编译器来处理变量的cosntness,而不是在任何地方都不改变它的值。编译器通常不能使用const
-信息作为优化的辅助。@Andreas:tr一般来说,虽然在实践中,我看到一些代码受益于自动变量的常量声明,但这是在一个旧的ish GCC上,而一个新的发现非常量变量是neve