我想知道在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',或者使用它来表明你引用的是一个好的做法同一类的成员。
答案 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,使用它真的是糟糕的做法,除非在真正需要它的少数情况下。
代码应包括所需内容 - 仅此而已。这并不是说你不能(例如)实现对软件使用不是严格必要的便利功能,而是代码应该包含实现这些功能所必需的功能。
我想补充一点,在我看来,在成员变量上使用m
或m_
等前缀属于同一类别:简单的噪音对真正的理解没有任何帮助。
无论哪种方式,感觉这种附加噪声的必要性往往表明代码设计得不是很好。有一些很少的情况(例如,传递给构造函数的参数),对于什么是内部值与来自外部的值有什么混淆是合理的,但这些都是例外,不是规则。由于它们是一个例外,防止/避免含糊不清的特殊措施也应限于它们 - 例如,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) {}
};