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

C++ class member same identifier as member function argument

本文关键字:成员 标识符 函数 c++ 参数      更新时间:2023-10-16

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

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

例如:

class M {
    [public/private:]
    int i;
    void add(int i)
    {
        (this->i) = ((this->i) + i);
        return;
    }
}

这是一个很奇怪的例子,但它说明了原理。括号是必需的吗?

正如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;
    }
};

代码有效,不需要括号

此外,还可以有

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

你的代码是正确的,但你可以直接使用:

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

,因为你不需要括号,而且+=不会使它看起来那么难看。顺便说一句:您不需要显式返回语句,因为方法在完成时自动返回。

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

你为什么不试试呢?

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

如果您经常遇到这个问题,那么您的标识符可能更长或更具描述性。对于函数形参或成员变量来说,i很难被接受。

您还会发现许多编码标准要求您将成员变量与函数参数区分开来,例如,通过在所有成员变量前面加上m_。在这种情况下,i成员变量将变为m_i。这些都是文体上的问题,有可能引发激烈的讨论。

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

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