上次阅读 /修改别人代码的时候看到一个类,里面有类似于 int out[100];
这种成员变量,在函数里直接访问也是用 out[0] = 123;
这种风格。
我第一眼以为这个 out
是函数的局部变量,是在最后返回值时用的。(其命名也很有迷惑性)结果后来才发现是类的成员变量。
最近写 Python 比较多,在 Python 里面,所有成员变量都会强制用 self.out
这种形式,看代码的时候可以很快看出是哪一种变量。(也许因为 Python 不需要显式声明变量,只有这样才能区别吧)
于是就产生了这个想法,即 C++ 中所有成员变量的访问都用 this->xxx
的形式,而不是直接用 xxx
。
我有这些问题:
this->xxx
”这一操作?或者在不用 this
直接访问时发出警告?还请大家分享一下自己的见解。
1
oneisall8955 2021-03-18 17:04:58 +08:00
c++不知道,java 也有 this,我举得是个人习惯而已,IDE 成员变量颜色和局部遍历不同,一眼就可以看出来
|
2
emSaVya 2021-03-18 17:05:40 +08:00
一般会加下划线 xxx_
|
3
Shazoo 2021-03-18 17:05:43 +08:00
最早都是硬性规定 m_打头定义成员变量。
后来为了能自动补全代码,全部自己老老实实打 this->前缀了…… |
4
zxlzy 2021-03-18 17:07:44 +08:00
不是重名变量的话,不应该加 this 。画蛇添足。也没有啥好处。
|
5
AlexGuo1998 OP @oneisall8955 #1 C++ 的 IDE 感觉又是一个坑点了。我一般用 JetBrains 的 CLion,默认是只支持 CMake 工程的,而别人的代码可能用了各种各样的 build system 。有时候只是临时改一下代码,不想去修改 build system,结果 IDE 就识别不了,高亮几乎没法用(反而 Python 、JAVA 的目录结构都比较固定)
|
6
msg7086 2021-03-18 17:22:15 +08:00 via Android
一般让 ide 自己识别就行了,鼠标指上去看。
|
7
wzxlovesy 2021-03-18 17:27:35 +08:00 via Android 1
加 this 增强代码可读性,即使没有 ide 也可以一眼看懂变量的归属。特别是有些变量在父类里,不写 this 还真不知道去哪找……
|
8
uurun 2021-03-18 17:49:10 +08:00
形成一个自己的风格就可以了 windows 很多都是 m_width 这样 或者 width_ 后面加下划线
|
9
nightwitch 2021-03-18 17:50:54 +08:00 1
三种最常见的风格
this->x x_ m_x |
10
ponwayway 2021-03-18 18:02:44 +08:00
因为公司规定成员变量必须是"m_类型+命名"这样的,所以变量一眼就看懂。
不过看以前项目的代码里,有不少的函数里加 this 和没加的混着在写。大概是别人写的时候,不记得的变量就用 this 点出来,记得就直接写上了 |
11
wzzzx 2021-03-18 18:07:08 +08:00
我以前会,后来发现这其实遵守命名规范就能解决了
|
12
AndyAO 2021-03-18 18:08:22 +08:00
解决这个问题的最好方案可能是,通过写 IDE 插件自动加上去。
你在阅读任何代码的时候,只要没加就加上个虚拟的,让你一眼就能看出来。 甚至你可以先去谷歌上搜索一下有没有这样的插件或者扩展,甚至 IDE 自带的某个设置,我相信很可能是有的。 JetBrains / Visual Studio / Visual Studio Code |
13
AlexGuo1998 OP @AndyAO #12 很好的 idea 。简单搜索了一下,JetBrains 和 Visual Studio 都没看到相关的插件,VS Code 未知。甚至 Google 都只找到两个 SO 帖子讨论这个问题……(可能是关键词不对?我搜的“C++ explicit this”)所以大概得自己写插件(开坑)了。
|
14
bruce0 2021-03-18 18:43:29 +08:00
前段时间我也在纠结这个东西 我还是习惯加上,虽然很多时候是多余的 但是加上后 一眼就知道是成员变量了
|
15
across 2021-03-18 18:55:42 +08:00
印象里成员都会加 this,大概 C#看多了也习惯了。 没有 this 默认是函数局部变量了
|
16
AndyAO 2021-03-18 18:58:51 +08:00
@AlexGuo1998 #13
期待你的作品 写编辑器或者 IDE 的扩展,是合格程序员的基本素质,程序员的工作是为别人提供自动化,如果他连自己的工作也不能力所能及的自动化,在我看来是一种耻辱。 所以即使需要花费很多时间,那也是必要的,后面收益应该会很大。 |
17
AndyAO 2021-03-18 19:03:45 +08:00 1
目前我这个需求不怎么破解,随便搜了搜,关键词是 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 |
18
across 2021-03-18 19:04:55 +08:00
|
19
lifetimeporn 2021-03-18 19:12:48 +08:00 via iPhone
这个看情况,感觉不是一概而论的情况,科学上来说,你要是继承很多或者友元这些的,变量数量多,类的体量庞大,那可以加 this,否则没必要,画蛇添足
|
20
AlexGuo1998 OP @AndyAO #17 刚刚用 IDEA 试了一下,是可以产生 warning 的,用 code cleanup 功能也可以一键全部修改。不过可惜 C++ 这边不支持了。
|
21
justforlook44444 2021-03-18 20:41:12 +08:00
没见过这种代码风格的要求
|
22
levelworm 2021-03-18 20:49:24 +08:00 via Android
自从用多了 Python 有时候写 C++不自觉的也会加 this->
|
23
Akiyu 2021-03-18 21:19:09 +08:00
是否有必要这么做 /这么做是否有确实的好处?
没有必要, 同名字空间变量名才会冲突. 一种好的习惯是成员变量都使用 _ 开头. 多余的 this-> 会让代码变得冗余. 是否有某些“C++代码风格指导性文件”提倡这么做? 不清楚. 但是 this-> 很没必要. 是否有某些(比较出名的)开源代码这么做? 不清楚. 至少 STL 自身决不会这么做. 外围 如 boost 之类的库, 大多数的源码. 都不会 + this-> 是否有程序可以自动化“将源代码中所有成员变量的直接访问全部改为 this->xxx”这一操作?或者在不用 this 直接访问时发出警告? 这样的需求很少, 工具自然也很少(据我所知, 没有) PS: 你可能担心变量名冲突的问题. 但实际这不会冲突. 同名字空间 /作用域时, 同变量名定义才会冲突. 但实际不会这样, 因为 C++ 的名字空间 /作用域是嵌套的, 内部优先级高于外部. 编译器绝不会在这里犯错. 如果你担心人可能搞错, 那么可以用用规范来解决, 如成员变量前置 _ |
24
Jirajine 2021-03-18 21:31:16 +08:00 via Android
这是 c++自己的问题,对象是 this 传进来的,为什么不加 this 能直接访问到?
如果是 static/类变量,那就应该只能通过 ClassName::Varname 这种命名空间的方式访问才合理。 |
25
Huelse 2021-03-18 21:48:31 +08:00
参考微软 C++项目,是从不加 this 的,类的成员变量就后缀下划线 var_name_ 即可
|
26
edimetia3d 2021-03-18 23:17:54 +08:00
我自己的经验是,写模板的时候都用 `this->x`,这样能保证使用 dependent name ,避免一些坑.
不过没有看到过类似的建议. |
27
DOLLOR 2021-03-19 00:16:06 +08:00
C++更习惯用 m_xxx 来命名成员变量,所以一般不用 this 。
Java 种 class 外不存在独立变量、函数的,都默认是成员了,this 就多余了。 Python 没有专门的声明变量的语句,不加 self 会认为你是在声明变量。 还有 JS,过去也有 with(this)这种写法,要到运行期才能知道是成员变量还是外部变量,会使得代码运行结果不可预知,也不利于性能优化。现在只能用 this 访问成员,不允许用 with 语句了。 |
28
EggtartZ 2021-03-19 08:59:15 +08:00 1
我就在 vtk 里见过加 this 的
|
29
sutra 2021-03-19 09:03:37 +08:00 1
Eclipse - Java - Editor - Save Actions - Member Accesses - Non static accesses:
Use 'this' qualifier for field accesses: Always or Only if necessary; Use 'this' qualifier for method accesses: Always or Only if necessary. checkstyle RequireThis: https://checkstyle.sourceforge.io/config_coding.html#RequireThis |
30
QBugHunter 2021-03-19 17:08:01 +08:00
@levelworm
py 不是 self 嘛? |