Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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,根据我不久前阅读的一些教程,“const”声明生成一个变量“常量”,即以后不能更改。 但是我发现这个常量声明有点不方便,因为编译器有时会给出类似 “无法将常量int转换为int” 或者类似的 不管怎样,我发现自己通过移除它来作弊 问题: 假设我很小心不要更改源代码中的变量,我能愉快地忘记这个常量吗 提前感谢您可以忘记它,但是如果编译器强制您使用它,这不是很好吗?这样,你的“常量”变量实际上保持不变。你是认真的吗?为什么你会因为有时犯错误而放弃这样一个有用的特性呢?最好尝试并学会避免使用const

根据我不久前阅读的一些教程,“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