C ++类成员与成员函数参数的标识符相同

时间:2014-08-10 11:03:29

标签: c++ identifier

C ++类成员函数的参数是否可以与同一类的成员数据具有相同的标识符(名称)?

我处理这个的方法是使用this指针,但我不确定代码是否会按预期编译;

例如:

class M {

    [public/private:]
    int i;

    void add(int i)
    {
        (this->i) = ((this->i) + i);

        return;
    }
}

相当奇怪的例子,但它证明了原理。是否需要括号?

4 个答案:

答案 0 :(得分:2)

正如Jarod42告诉你的那样,代码在没有括号的情况下有效。

另一种不使用this的方法是使用范围解析运算符::

class M {

public:
    int i=0;   // better initialize it, if you do not have a constructor. 

    void add(int i)
    {
        M::i = M::i + i;  // the i belonging to class M vs. parameter i 

        return;
    }
};

答案 1 :(得分:1)

代码有效,不需要括号。

此外,您可能还有

class M
{
public:
    explicit M(int i) : i(i) {} // initialize member with method argument as expected.

private:
    int i;
};

答案 2 :(得分:1)

您的代码是正确的,但您可以使用:

void add(int i) {
    this->i += i;
}

因为你不需要括号,+=也不会让它看起来如此丑陋。顺便说一句:您不需要显式的return语句,因为该方法会在完成后自动返回。

答案 3 :(得分:0)

  

但是我不确定代码是否会按预期编译;

为什么不试试呢?

无论如何,答案是:是的,它会。

只是如果你经常遇到这个问题,很可能你的标识符可能更长或更具描述性。 i几乎不是函数参数或成员变量的可接受名称。

您还会发现许多编码标准要求您区分成员变量和功能参数,例如:通过在m_之前添加所有成员变量。在这种情况下,您的i成员变量将变为m_i。这些是风格问题,有可能引发激烈的讨论。

示例中的括号是多余的。有时,多余的括号增强了代码的可读性,但在这种情况下,我不这么认为。当然,使用+=运算符可以进一步简化代码:

void add(int i)
{
    this->i += i;

    return;
}