【问题标题】:Const correctness of function parameters, that are passed by value [duplicate]按值传递的函数参数的常量正确性[重复]
【发布时间】:2012-05-30 14:23:47
【问题描述】:

可能重复:
Const correctness for value parameters

我认为以下是一种良好的编码实践。当参数通过值传递给函数时,它应该只被读取,而不能在函数体中修改(或重用)。但这真的是一种好习惯吗?

示例(我避免做的):

int foo(int x){
    //do lots of cool stuff
    x = 69;
    //do even cooler stuff
}

从这里我们得到 const 正确性。假设我的实践很好,那么几乎每个函数的每个参数都应该以“const”开头。实际上“a”是乐观的:

class A{
    const int gnoo(const int *const, const double) const;
};

【问题讨论】:

  • 不返回 const 副本。除了让其他人的生活变得悲惨之外,它没有任何用处。如果它是引用或指针,则可以,但不是副本。

标签: c++ c arguments constants


【解决方案1】:

这个问题有两个方面,声明定义。在声明点,函数参数的顶级限定符被删除,因此const 被编译器删除。另一方面,在定义中,编译器确保如果参数是const,它不会在内部被修改。

返回类型是另一回事,const 没有从 声明 中删除,但在这种情况下,您很可能不想创建返回的对象(如果它是由值)const,因为这可能会限制以几种不同方式优化编译器的机会。第一个,C++11 中的新功能是不能移动const 对象,这意味着通过返回const 对象可以禁止移动 从中。在 C++03 中,这种影响的情况越来越少,但返回 const 对象的优势有限。

有些人建议在任何地方添加const。我没有,我读过的大多数代码也没有。

【讨论】:

  • 只是一个例子,当返回类型应该是 const 时,即使是按值:假设我为存储在我的类中的一个数组块创建一个视图并返回它。为了防止人们通过视图修改我的类(即使带有移动语义),我可以将 const 添加到返回类型。
【解决方案2】:

你的观点很好。并且根据语言的不同,编译器/解释器在看到像您的第一个示例这样的代码时可能会抛出错误或警告。

但是,在某些时候,您必须选择是否要尝试保护“开发人员”免于做一些愚蠢的事情,或者只是假设他们这样做并在代码审查期间发现这类事情。

利用句法机制使代码更安全是一件好事,恕我直言。不幸的是,它可能会阻碍开发流程。

【讨论】:

  • 我的问题是一个帖子中的两个问题。所以你和我在一起,而不是修改按值传递的参数。曾经。然而,困扰我的第二件事是如何“尽可能地把“const”放在任何地方”。这意味着对所有函数的几乎所有参数都进行 const 化。
  • 你提出的是一个句法表达,一个哲学问题的解决方案。函数式的人说,函数(或方法)的副作用为零是件好事。我同意这一点。当幂等时它们甚至更好(它们为相同的参数集返回相同的值)。语法强制对程序员的限制程度是另一回事。想想 Java 要求公布方法可能抛出的异常......所有现代工具都将其排除在程序员之外,从而消除了语法要求的意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2018-08-30
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2015-12-13
相关资源
最近更新 更多