【问题标题】:Usage of const and references in parameters in c++ [duplicate]c++中参数中const和引用的使用[重复]
【发布时间】:2018-09-23 17:15:07
【问题描述】:

制作方法有多种方式。我不太确定何时在方法参数中使用 const 和 reference。

想象一个名为“getSum”的方法,它返回两个整数的和。这种方法中的参数可以有多种形式。

int getSum1(int, int);
int getSum2(int&, int&);
int getSum3(const int, const int);
int getSum4(const int&, const int&);

如果我错了,请纠正我,但这是我对这些方法的看法:

  • getSum1 - 复制整数并计算
  • getSum2 - 不复制整数,而是直接使用内存中的值并计算
  • getSum3 - 承诺值不会改变
  • getSum4 - 承诺值不会改变并且不会复制整数,而是直接使用内存中的值

所以这里有一些问题:

  1. 那么getSum2getSum1 快,因为它不复制整数,而是直接使用它们?

  2. 由于值没有改变,我认为 'const' 在这种情况下没有任何区别,但它是否应该仍然存在以保证 const 的正确性?

  3. 双打也一样吗?

  4. 是否应该只对非常大的参数使用引用?例如如果我要给它上一堂课,那么复制整个东西是没有意义的

【问题讨论】:

  • getSum3 - Promises that the values won't change 应该是copies and promises,您缺少copies
  • 不,没有必要更快,而且很可能会更慢。函数调用仍必须将两个参数传递给函数。除了现在函数没有要添加的两个值,而是必须通过引用指针访问它们。

标签: c++ methods parameters reference constants


【解决方案1】:
  1. 对于整数,这在实践中是无关紧要的。处理器与寄存器一起工作(并且int 适用于除了最奇特的硬件之外的所有寄存器),复制寄存器基本上是最便宜的操作(在 noop 之后),如果编译器在聪明的方式。

  2. 如果要更改传递的整数,请使用此选项。非常量引用参数一般表示您打算修改参数(例如,存储多个返回值)。

  3. 这与 1. 完全相同,原因基本相同。您无法更改传递的整数,但如果您这样做了,没有人会更明智(即使用 1. 代替)。

  4. 1234563作为提供副本,但后者避免了不必要的记忆之旅。除非您使用指向参数的指针(在这种情况下,编译器必须保证它指向调用站点上的 int),否则这是没有意义的。

请注意,以上内容不是针对 C++ 抽象机器,而是针对现代硬件/编译器所发生的情况。如果您正在处理没有专用浮点功能的硬件或整数不适合寄存器的情况,则必须更加小心。我没有对当前嵌入式硬件趋势的概述,但除非你真的为烤面包机编写代码,否则你应该很好。


如果您处理的不是整数而是(大)类,那么语义差异会更大:

  1. 函数接收副本。请注意,如果您传入一个临时文件,则该副本可能是移动构造的(或者更好的是,省略了)。

  2. 与“int 部分”相同,仅在要更改传递的值时才使用 4。

  3. 您收到一份无法更改的副本。这在特定情况之外通常不是很有用(或为了提高边际代码的清晰度)。

  4. 如果您打算只读取(或调用 const 方法)它,这应该是传递大型类(嗯,几乎比指针大的任何东西)的默认设置。

【讨论】:

    【解决方案2】:

    你是对的。 a 和 b 的值不会被复制。但是将复制 a 和 b 的地址,在这种情况下,您不会获得任何速度,因为 int 和指向 int 的指针具有相同(或大致相同)的大小。如果函数的参数大小很大,例如您在 Q4 中提到的结构或类,您将获得速度。

    2)
    const 意味着你不能改变参数的值。如果没有声明为 const 可以在函数内部进行更改,但调用函数时使用的原始值或变量不会被更改。

    int getSum1(int a, int b)
    {
        a = a + 5;
        return a + b;
    }
    
    int a, b, foo;
    a = 10;
    b = 5;
    foo = getSum1(a, b);
    

    在这种情况下,foo 的值为 20
    a 等于 10
    b 等于 5
    由于 a 的修改只是函数 getSum1() 的局部

    【讨论】:

    • 你认为引用有什么问题?
    • 这里有个小秘密。引用确实是指针。
    • 是的,我现在知道那是 C++ 而不是 C。我的错
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2012-06-14
    • 2017-07-05
    • 2021-05-23
    • 2013-06-03
    • 2013-01-14
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多