在C++中使用'this'是一种好的编程实践吗?

7
我在想在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”,尤其是当它像this->layout->addWidget(this.textArea);这样使用时,它会看起来更好。我认为代码应该在大多数情况下使用相同的风格,以使其更易于阅读,所以,我应该仅在必要时使用“this”,或者使用“this”以清楚地表示您正在引用同一类的成员,这是一个好习惯吗?

我曾经在一些情况下看到过这种用法,如果传递给函数的变量与成员变量具有相同的名称,则可以使用它。这在构造函数中很常见。然后你可以说 this->myVal = myVal,它会做正确的事情。否则,我通常不喜欢这样做。 - StilesCrisis
1
这段代码真正的问题不是使用 this,而是内存泄漏。代码有太多实际问题(包括在这种情况下),我们无需担心这些微不足道的小点问题。 - Mankarse
@StilesCrisis 但是如果你自己编写函数,你也可以选择参数的名称,因此你可以轻松地将其更改为不需要 this-> 的内容。这就是我所做的。 - Mr Lister
1
由于在C++中,'this'是一个指针,所以'this.textArea'将会出错。正确的写法应该是'this->textArea'或者'*this.textArea',以访问指针所指向的对象而非指针本身。 - Topo
@MrLister:嗯,在第二次阅读代码时,我意识到实际上没有足够的信息来确定,因此我撤回了先前的声明。 - Mankarse
显示剩余2条评论
6个回答

11

这没有一个标准答案。它取决于上下文,也取决于所询问的人。

有些人总是使用this。有些人从不使用。有些人则将所有成员变量重命名为特殊前缀(mFile而不是file)。

我倾向于只在必要时使用this前缀以避免歧义。

在编写良好的代码中,通常很容易确定您正在引用本地变量还是成员变量,因此this并没有太多作用。但有时读者很难确定一个变量是类成员还是局部变量。这时,使用this可以澄清。


也许更好的做法是为您的成员变量添加前缀,比如单个下划线、字母m或者m_等,如果只是出于这个原因的话? - Alok Save
5
通常我不使用“成员前缀”,因为它似乎没有意义。我们已经有一个标准前缀,即this->,我可以(而且也确实)在必要时使用它。当不需要时,我不想用一些虚假的匈牙利命名法使我的代码混乱。 - jalf
1
由于这也更多是一种偏好和选择的问题,而不是语法正确性的问题,如果这是你的偏好,我会说可以理解。:) - Alok Save

8
如果使用this使代码更易读(也就是更容易理解),那么额外的输入量完全值得努力。在复杂的程序中,每行代码只会被编写一次,但会被许多人多次阅读(不同的程序员),因此这是一个很好的投资。
我所知道的最易读的语言之一,Python,要求你每次都写self.x(相当于C++的this->x),这并不是问题。问题是,在Python中,当你写slef.x而非self.x时,错误将在运行时捕获,但这是一个不相关的问题...

3
编译器对此没有影响(在您的示例中)。 这是用户偏好的问题,有些人觉得它更直观,而有些人则认为不需要额外的打字。 因此,如果您使用的编码指南要求,请使用它。 请注意,在某些情况下,您确实需要使用“this”,因为没有其他方法来处理它,但我认为这不是您的问题。

2
下投票的原因是什么?你不同意什么或者你认为哪里有错误? - Alok Save
1
OP知道这对编译器没有影响,而且似乎他们没有遵循任何样式指南。 - Marcin
@Marcin:你是怎么得出“似乎他们没有遵循任何样式指南”的结论的?既然这只是个人偏好问题,那么回答OP的问题就是使用编码指南所说的或选择被要求做的事情。在这种情况下,没有正确的答案。 - Alok Save
我的结论既不是过于笼统也不是奇怪的。如果你没有有用的贡献,你不需要发表答案。 - Marcin
@Marcin:感谢您的评论,但它们只不过是毫无意义的胡言乱语。 - Alok Save
真的吗?你怎么想的?哪些部分你没明白?你认为你必须回答每一个C++问题吗? - Marcin

2

个人而言,我不喜欢使用this关键字。
但我认为这是个人偏好的问题。只要你保持一致,就不应该有问题。

注意:我也会确保使用-WShadow -WError编译。


这些参数有什么作用? - Topo
1
@Topo:当内部作用域中的变量与外部作用域中的变量同名时,就会发生“shadowing”。如果我编写一个具有属性x的类,并且该类的某个方法具有参数x,那么在这个方法中,参数会遮蔽掉属性。使用-Wshadow选项可以让编译器发出警告,而使用-Werror选项将此警告转化为错误,以确保不会忽略它。 - Matthieu M.
+1 只是因为个人偏好的答案被过度贬低,而这是我的个人喜好。我喜欢让 this-> 突出显示它所代表的不便之处,只使用 this-> 作为“这里有些棘手”的提示(例如,两阶段名称查找)。 - David Hammen

2

在我看来,使用"this"关键字来表示成员变量并不常见。我认为这样会显得很混乱。我更喜欢给所有的成员变量加上"m_"前缀,这样就可以清楚地区分出成员变量和局部变量了。当然,还有更重要的良好实践,例如Scott Meyers所写的《More Effective C++》。


3
请考虑解释为什么我的回答会被踩,以避免未来的错误回答。非常感谢。 - Paskas
我给这个点踩了,因为它没有提供有关良好实践的任何信息,而你推荐一本书是因为它包含了未指明的主题信息。 - Marcin

0

我通常更喜欢使用this来表示所有成员变量。

在你的例子中,它看起来有些冗余,因为你没有引用任何局部变量。然而,在使用混合局部变量和实例变量(甚至类变量)的代码中,知道要查找哪个变量会更加清晰明了。


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