如果我传递的所有内容都是单个字符,我应该传递一个常量引用吗?

时间:2014-05-10 15:17:52

标签: c++

根据我的理解,这样做:

bool isLetter(char c)
{
    return c >= 'a' && c <= 'z';
}

int main()
{
    char mychar = 'j';
    std::cout << isLetter(j);
    return 0;
}

相当于:

int main()
{
    char mychar = 'j';
    // ---- function procedure ----
    char temp1 = mychar;
    bool temp2 = temp1 >= 'a' && temp1 <= 'z';
    // -----------------------------
    bool mybool = temp2;
    std::cout << mybool;
    return 0;
}

由于cisLetter的值未经修改,我可以通过“传入常量引用”来缩短过程。 const前缀对程序有无影响;它只是编译器和I之间​​的协议。引用前缀&是重要的部分,因为它意味着函数将使用实际变量c而不是它的副本temp1

因此,

bool isLetter(const char & c)
{
    return c >= 'a' && c <= 'z';
}

int main()
{
    char mychar = 'j';
    std::cout << isLetter(j);
    return 0;
}

相当于

int main()
{
    char mychar = 'j';
    // ---- function procedure ----
    bool temp = mychar >= 'a' && mychar <= 'z';
    // -----------------------------
    bool mybool = temp;
    std::cout << mybool;
    return 0;
}

嗯,这是我的理解。

几个问题:

  • 我的理解是否正确?如果没有,你能解开我的方式吗?
  • 使用c >= 'a' && c <= 'z'是安全的还是不好的做法,因为可能有一些系统上的ASCII值没有按常规方式排序?
  • 我的主要问题:当函数是如此简单的过程时,是否有任何传递常量引用的点??? C ++程序员是否会费心去做?
  • 我可以 - 如果是这样,我将如何更改功能以便返回引用?

感谢。我正在尝试回顾C ++原则,因为我正在接受面试。

1 个答案:

答案 0 :(得分:1)

  1. 您的理解是正确的。
  2. 如果使用,ASCII字符将具有相同的排序(z之后将始终a
  3. 我猜不是。编译器会在合理的情况下应用优化。此外,C ++中的所有内容都是按值传递的。所以reference将按值传递,复制的开销比复制字符本身要多。
  4. 从不pointerreference返回给本地变量。当函数返回时,变量将不再存在,pointerreference将无效,使用它们将导致未定义行为