【问题标题】:Using alias in C++ without altering value of original variable?在 C++ 中使用别名而不改变原始变量的值?
【发布时间】:2015-01-12 20:41:46
【问题描述】:

所以我必须编写一个程序来计算数组中某些元素的总和,然后找到总和的位数(例如,如果几个元素的总和是 175,我必须打印sum (175) 和 175 (3) 的位数。

为了确定位数,我使用以下“while”循环:

while (sum > 0)
{
    sum /= 10;
    digits++;
}

您可能已经注意到,在循环结束时,总和为 0。所以我想创建一个别名“sum”:

int& rSum = sum;

所以我简单地将数组中的“sum”替换为“rSum”,以便找到位数,并在程序结束时打印 sum。无论如何,循环后“sum”的值为0,即等于“rSum”。所以我想,当您为某个变量创建别名时,修改别名,修改变量本身,这在我的情况下是一个问题。

我的问题是,我可以使用别名(或使用引用、指针等)创建程序,还是创建“sum”变量(int rSum = sum;)的副本的唯一方法?

【问题讨论】:

    标签: c++ pointers reference alias


    【解决方案1】:

    Skizz 在这里提出了一种基于对数的方法: Efficient way to determine number of digits in an integer。 或者看看布拉德的解决方案。 但是,如果您使用除法,则需要一份副本。

    【讨论】:

      【解决方案2】:

      您的问题看起来像“如何在不复制此变量的情况下复制此变量?”。

      我认为您的担忧源于低一级,您认为制作副本会降低代码的可读性 - 我同意。但是你可以很简单地对抗它:

      int sum = ...;
      int digits = countDigits(sum);
      

      countDigits 提取到一个单独的函数仍然会复制您的sum 变量,因为它是按值复制的(这没关系),但是这个副本将是临时的(对于countDigits 来说是本地的)并且不会不要在你原来的功能中造成不必要的混乱。

      【讨论】:

      • 我尝试这样做的真正原因是因为我在大学里学习指针和引用,所以我想找到不同的(据说更好的)使用这些东西执行某些任务的方法。我只是想尽可能多地找到我所学知识的实际应用。 :)
      【解决方案3】:

      这也会创建sum 的副本,但至少不会是你:

      const int& orgSum = sum + 0;
      
      while (sum > 0)
      {
          sum /= 10;
          digits++;
      }
      
      cout << orgSum << endl;
      

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 1970-01-01
        • 2013-03-06
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 2014-02-20
        • 1970-01-01
        相关资源
        最近更新 更多