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 直接访问时发出警告?

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

2962 次点击
所在节点    C
30 条回复
justforlook44444
2021-03-18 20:41:12 +08:00
没见过这种代码风格的要求
levelworm
2021-03-18 20:49:24 +08:00
自从用多了 Python 有时候写 C++不自觉的也会加 this->
Akiyu
2021-03-18 21:19:09 +08:00
是否有必要这么做 /这么做是否有确实的好处?
没有必要, 同名字空间变量名才会冲突. 一种好的习惯是成员变量都使用 _ 开头.
多余的 this-> 会让代码变得冗余.

是否有某些“C++代码风格指导性文件”提倡这么做?
不清楚. 但是 this-> 很没必要.

是否有某些(比较出名的)开源代码这么做?
不清楚. 至少 STL 自身决不会这么做. 外围 如 boost 之类的库, 大多数的源码. 都不会 + this->

是否有程序可以自动化“将源代码中所有成员变量的直接访问全部改为 this->xxx”这一操作?或者在不用 this 直接访问时发出警告?
这样的需求很少, 工具自然也很少(据我所知, 没有)

PS:
你可能担心变量名冲突的问题. 但实际这不会冲突. 同名字空间 /作用域时, 同变量名定义才会冲突. 但实际不会这样,
因为 C++ 的名字空间 /作用域是嵌套的, 内部优先级高于外部. 编译器绝不会在这里犯错. 如果你担心人可能搞错, 那么可以用用规范来解决, 如成员变量前置 _
Jirajine
2021-03-18 21:31:16 +08:00
这是 c++自己的问题,对象是 this 传进来的,为什么不加 this 能直接访问到?
如果是 static/类变量,那就应该只能通过 ClassName::Varname 这种命名空间的方式访问才合理。
Huelse
2021-03-18 21:48:31 +08:00
参考微软 C++项目,是从不加 this 的,类的成员变量就后缀下划线 var_name_ 即可
edimetia3d
2021-03-18 23:17:54 +08:00
我自己的经验是,写模板的时候都用 `this->x`,这样能保证使用 dependent name ,避免一些坑.

不过没有看到过类似的建议.
DOLLOR
2021-03-19 00:16:06 +08:00
C++更习惯用 m_xxx 来命名成员变量,所以一般不用 this 。
Java 种 class 外不存在独立变量、函数的,都默认是成员了,this 就多余了。
Python 没有专门的声明变量的语句,不加 self 会认为你是在声明变量。
还有 JS,过去也有 with(this)这种写法,要到运行期才能知道是成员变量还是外部变量,会使得代码运行结果不可预知,也不利于性能优化。现在只能用 this 访问成员,不允许用 with 语句了。
EggtartZ
2021-03-19 08:59:15 +08:00
我就在 vtk 里见过加 this 的
sutra
2021-03-19 09:03:37 +08:00
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
QBugHunter
2021-03-19 17:08:01 +08:00
@levelworm
py 不是 self 嘛?

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

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

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

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

© 2021 V2EX