C++编程时是否有“成员变量全部显式使用 this”的代码风格?

2021-03-18 17:01:27 +08:00
 AlexGuo1998

上次阅读 /修改别人代码的时候看到一个类,里面有类似于 int out[100]; 这种成员变量,在函数里直接访问也是用 out[0] = 123; 这种风格。

我第一眼以为这个 out 是函数的局部变量,是在最后返回值时用的。(其命名也很有迷惑性)结果后来才发现是类的成员变量。

最近写 Python 比较多,在 Python 里面,所有成员变量都会强制用 self.out 这种形式,看代码的时候可以很快看出是哪一种变量。(也许因为 Python 不需要显式声明变量,只有这样才能区别吧)

于是就产生了这个想法,即 C++ 中所有成员变量的访问都用 this->xxx 的形式,而不是直接用 xxx

我有这些问题:

  1. 是否有必要这么做 /这么做是否有确实的好处?
  2. 是否有某些“C++代码风格指导性文件”提倡这么做?
  3. 是否有某些(比较出名的)开源代码这么做?
  4. 是否有程序可以自动化“将源代码中所有成员变量的直接访问全部改为 this->xxx”这一操作?或者在不用 this 直接访问时发出警告?

还请大家分享一下自己的见解。

3195 次点击
所在节点    C
30 条回复
oneisall8955
2021-03-18 17:04:58 +08:00
c++不知道,java 也有 this,我举得是个人习惯而已,IDE 成员变量颜色和局部遍历不同,一眼就可以看出来
emSaVya
2021-03-18 17:05:40 +08:00
一般会加下划线 xxx_
Shazoo
2021-03-18 17:05:43 +08:00
最早都是硬性规定 m_打头定义成员变量。
后来为了能自动补全代码,全部自己老老实实打 this->前缀了……
zxlzy
2021-03-18 17:07:44 +08:00
不是重名变量的话,不应该加 this 。画蛇添足。也没有啥好处。
AlexGuo1998
2021-03-18 17:16:59 +08:00
@oneisall8955 #1 C++ 的 IDE 感觉又是一个坑点了。我一般用 JetBrains 的 CLion,默认是只支持 CMake 工程的,而别人的代码可能用了各种各样的 build system 。有时候只是临时改一下代码,不想去修改 build system,结果 IDE 就识别不了,高亮几乎没法用(反而 Python 、JAVA 的目录结构都比较固定)
msg7086
2021-03-18 17:22:15 +08:00
一般让 ide 自己识别就行了,鼠标指上去看。
wzxlovesy
2021-03-18 17:27:35 +08:00
加 this 增强代码可读性,即使没有 ide 也可以一眼看懂变量的归属。特别是有些变量在父类里,不写 this 还真不知道去哪找……
uurun
2021-03-18 17:49:10 +08:00
形成一个自己的风格就可以了 windows 很多都是 m_width 这样 或者 width_ 后面加下划线
nightwitch
2021-03-18 17:50:54 +08:00
三种最常见的风格
this->x
x_
m_x
ponwayway
2021-03-18 18:02:44 +08:00
因为公司规定成员变量必须是"m_类型+命名"这样的,所以变量一眼就看懂。
不过看以前项目的代码里,有不少的函数里加 this 和没加的混着在写。大概是别人写的时候,不记得的变量就用 this 点出来,记得就直接写上了
wzzzx
2021-03-18 18:07:08 +08:00
我以前会,后来发现这其实遵守命名规范就能解决了
AndyAO
2021-03-18 18:08:22 +08:00
解决这个问题的最好方案可能是,通过写 IDE 插件自动加上去。

你在阅读任何代码的时候,只要没加就加上个虚拟的,让你一眼就能看出来。

甚至你可以先去谷歌上搜索一下有没有这样的插件或者扩展,甚至 IDE 自带的某个设置,我相信很可能是有的。

JetBrains / Visual Studio / Visual Studio Code
AlexGuo1998
2021-03-18 18:35:37 +08:00
@AndyAO #12 很好的 idea 。简单搜索了一下,JetBrains 和 Visual Studio 都没看到相关的插件,VS Code 未知。甚至 Google 都只找到两个 SO 帖子讨论这个问题……(可能是关键词不对?我搜的“C++ explicit this”)所以大概得自己写插件(开坑)了。
bruce0
2021-03-18 18:43:29 +08:00
前段时间我也在纠结这个东西 我还是习惯加上,虽然很多时候是多余的 但是加上后 一眼就知道是成员变量了
across
2021-03-18 18:55:42 +08:00
印象里成员都会加 this,大概 C#看多了也习惯了。 没有 this 默认是函数局部变量了
AndyAO
2021-03-18 18:58:51 +08:00
@AlexGuo1998 #13

期待你的作品

写编辑器或者 IDE 的扩展,是合格程序员的基本素质,程序员的工作是为别人提供自动化,如果他连自己的工作也不能力所能及的自动化,在我看来是一种耻辱。

所以即使需要花费很多时间,那也是必要的,后面收益应该会很大。
AndyAO
2021-03-18 19:03:45 +08:00
目前我这个需求不怎么破解,随便搜了搜,关键词是 IDEA Add "this" automatically,发现 IDEA 自带 this 「代码样式检查」,可以自己配置,如果没有加会有提醒。

这就是我所说的 IDEA 自己的机制,看来是有的,效果暂时不太清楚。

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206198089-Add-this-to-member-variables-methods-in-IntelliJ-Idea
across
2021-03-18 19:04:55 +08:00
lifetimeporn
2021-03-18 19:12:48 +08:00
这个看情况,感觉不是一概而论的情况,科学上来说,你要是继承很多或者友元这些的,变量数量多,类的体量庞大,那可以加 this,否则没必要,画蛇添足
AlexGuo1998
2021-03-18 20:14:57 +08:00
@AndyAO #17 刚刚用 IDEA 试了一下,是可以产生 warning 的,用 code cleanup 功能也可以一键全部修改。不过可惜 C++ 这边不支持了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/762899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX