将参数与成员变量使用相同的名称是否不好?

24
例如,这是以下哪种情况:
  • 不良实践
  • 难以阅读
  • 效率低下(调用this指针)
  • 其他任何原因导致此做法不好

.

class Person {

    public:
        string name;
        Person(string name) {
            this->name = name;
        }

};

附言:

如何理解 Person(string name) : name(name) { }


你为什么认为这会低效? - Fred Foo
我不知道,也许是这个指针多出的4个字节的开销太大了 :/ 这就是为什么我在问。 - Oleksiy
3
以上均不是答案,这是一个常见的习语。 - Sergey Kalinichenko
@OleksiyDobrodum:无论你是否明确声明,this关键字始终存在。 - Mat
1
开销在于默认构造一个字符串,然后再对其进行赋值。使用构造函数初始化列表,这样就不用担心了。 - juanchopanza
显示剩余2条评论
2个回答

20

不,我不认为这是一种不好的做法。有时我们甚至会在不同的库中遇到相同的方法名或属性名。这就是为什么我们创建命名空间和类来解决命名冲突的原因。

只要不会导致混淆,就应该尽可能简单明了,即使它们使用相同的名称。然而,你不应该混淆它们,例如:

class Person {
public:
    Person(name) {
        this->name = name;
        name = clean(this->name);
        this->name = prefix + name;
    }

private:
    string name;
};

保持干净:

class Person {
public:
    Person(name) {
        name = clean(name);
        name = prefix + name;

        this->name = name;
    }

private:
    string name;
};

4
我能想到的唯一问题(不是真正的问题)是,你无法区分成员变量、局部变量或函数参数。这只是编码风格而已,并不影响效率,但若谈到代码不易读,在我看来就是有问题的。
对于我来说,我通常会在类成员变量的名称后加下划线。这有助于代码的可读性,使得维护更加容易。
class Person {    
    public:
        string name_;                // member variable with traling `_`
        string m_surname;            // some microsoft style declares member start with `m_`
        Person(const string& name)   // pass parameter by reference. 
        : name_(name)                // you know you are constructing member name_ with name variable
        {
        }

};

13
我看过所有这些样式,认为它们非常丑陋和不必要。在API文档中,如果构造函数参数和公共成员变量具有相同的名称,只要它们实际上表示相同的事情,这实际上是有帮助的。 - Fred Foo
4
我认为说你不能区分成员变量和函数参数是不公平的,因为你显然可以。成员变量可以用 this->varname 来引用,而函数参数则可以用 varname 来引用。(当然,在没有函数参数的情况下就不会有混淆了。) - Radon Rosborough
2
我喜欢当有人回答一个主观问题时,另外两个人用更主观的答案批评这个主观答案。如果这是一种已知的编程风格,那么人们会出于某种原因使用它。我个人使用相同的参数作为成员变量。它完全可以正常工作。 - luminol
1
@luminol 有时候这种多样的回应让我对编程社区成员在主观问题上的看法有了一个有用且代表性的感觉。当你来自不同的语言背景,想要知道会有什么样的期望时,这尤其有用。 - Chris Mountford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接