在C ++中使用'this'是一个好习惯吗?

时间:2012-04-25 06:11:37

标签: c++ coding-style

我想知道在C ++中使用'this'是否是一个好习惯。起初我以为我应该因为这样你明白你所引用的东西是当前类的成员,但有时你会用以下代码结束:

Document::Document(QWidget *parent) : QWidget(parent)
{
    this->file = 0;
    this->layout = new QGridLayout(this);
    this->layout->setSpacing(2);
    this->layout->setMargin(0);
    this->setLayout(this.layout);
    this->textArea = new QTextEdit(this);
    this->textArea->setLineWrapMode(QTextEdit::NoWrap);
    this->textArea->setAcceptDrops(true);
    this->textArea->setAcceptRichText(true);
    this->textArea->setUndoRedoEnabled(true);
    this->textArea->setFont(QFont("Mono" , 11));
    this->layout->addWidget(this->textArea);
    this->textArea->show();
    this->textArea->setFocus();
}

我认为,如果像this->layout->addWidget(this.textArea);一样使用它,那么看起来会更好。我认为在大多数情况下代码应该使用相同的样式,以便更容易阅读,所以,如果有必要我应该使用'this',或者使用它来表明你引用的是一个好的做法同一类的成员。

7 个答案:

答案 0 :(得分:6)

对此没有单一的答案。这取决于具体情况,取决于你的要求。

有些人一直使用this。有些人从不使用它。有些人使用特殊前缀(mFile而不是file)重命名所有成员变量。

我希望在必要时只使用this前缀来避免含糊不清。

在编写良好的代码中,通常很明显你是指一个本地变量还是一个成员变量,因此this并没有真正起作用。但有时读者很难确定变量是否是类成员。然后this是澄清的好方法。

答案 1 :(得分:5)

如果使用this使其更容易阅读(更容易理解,那就是),那么额外的打字是非常值得的。

在一个复杂的程序中,每行代码都会被写入一次,但会多次读取(并且由不同的程序员编写),所以这是一个很好的投资。

我所知道的最易读的语言之一,Python,强迫你每次都写self.x(相当于this->x的C ++),这根本不是问题。问题在于,在Python中编写slef.x而不是self.x时,错误会在运行时中被捕获,但这是一个不同的无关问题......

答案 2 :(得分:2)

它对编译器没有影响(在你的例子中) 它是用户的偏好问题,有些人认为它更具有直观性,而有些人却发现它不需要额外输入 因此,如果您使用的编码指南说明您应该使用它。

请注意,某些情况下您确实需要使用this,因为没有其他方法可以解决这个问题,但这不是我所看到的问题。

答案 3 :(得分:2)

我个人不喜欢使用this 但我认为这是个人喜好的事情。只要你的一致就没关系。

注意:我还确保使用-WShadow -WError

进行编译

答案 4 :(得分:2)

在我看来,对会员使用“this”并不常见。恕我直言,它看起来很混乱。我更喜欢为所有成员使用“m_”前缀,因此很明显什么是成员,什么是局部变量。无论如何,有更重要的良好实践,例如Scott Meyers编写的更有效的C ++。

答案 5 :(得分:0)

我通常更喜欢为所有成员使用this的代码。

在您的示例中,它看起来多余,因为您没有引用任何局部变量。但是,在使用本地和实例(甚至是类)变量混合的代码中,确切地知道要查找的位置要好得多。

答案 6 :(得分:0)

IMO,使用它真的是糟糕的做法,除非在真正需要它的少数情况下。

代码应包括所需内容 - 仅此而已。这并不是说你不能(例如)实现对软件使用不是严格必要的便利功能,而是代码应该包含实现这些功能所必需的功能。

我想补充一点,在我看来,在成员变量上使用mm_等前缀属于同一类别:简单的噪音对真正的理解没有任何帮助。

无论哪种方式,感觉这种附加噪声的必要性往往表明代码设计得不是很好。有一些很少的情况(例如,传递给构造函数的参数),对于什么是内部值与来自外部的值有什么混淆是合理的,但这些都是例外,不是规则。由于它们是一个例外,防止/避免含糊不清的特殊措施也应限于它们 - 例如,init的前缀是系统的但仍然有意义:

class X { 
    int x, y, z;
public:
    X(int init_x, int init_y, int init_z) : x(init_x), y(init_y), z(init_z) {}
};