V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AlexGuo1998
V2EX  ›  C

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

  •  1
     
  •   AlexGuo1998 · 2021-03-18 17:01:27 +08:00 · 2921 次点击
    这是一个创建于 1124 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    我有这些问题:

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

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

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

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

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

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

    期待你的作品

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

    所以即使需要花费很多时间,那也是必要的,后面收益应该会很大。
    AndyAO
        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
    across
        18
    across  
       2021-03-18 19:04:55 +08:00
    lifetimeporn
        19
    lifetimeporn  
       2021-03-18 19:12:48 +08:00 via iPhone
    这个看情况,感觉不是一概而论的情况,科学上来说,你要是继承很多或者友元这些的,变量数量多,类的体量庞大,那可以加 this,否则没必要,画蛇添足
    AlexGuo1998
        20
    AlexGuo1998  
    OP
       2021-03-18 20:14:57 +08:00
    @AndyAO #17 刚刚用 IDEA 试了一下,是可以产生 warning 的,用 code cleanup 功能也可以一键全部修改。不过可惜 C++ 这边不支持了。
    justforlook44444
        21
    justforlook44444  
       2021-03-18 20:41:12 +08:00
    没见过这种代码风格的要求
    levelworm
        22
    levelworm  
       2021-03-18 20:49:24 +08:00 via Android
    自从用多了 Python 有时候写 C++不自觉的也会加 this->
    Akiyu
        23
    Akiyu  
       2021-03-18 21:19:09 +08:00
    是否有必要这么做 /这么做是否有确实的好处?
    没有必要, 同名字空间变量名才会冲突. 一种好的习惯是成员变量都使用 _ 开头.
    多余的 this-> 会让代码变得冗余.

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

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

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

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

    不过没有看到过类似的建议.
    DOLLOR
        27
    DOLLOR  
       2021-03-19 00:16:06 +08:00
    C++更习惯用 m_xxx 来命名成员变量,所以一般不用 this 。
    Java 种 class 外不存在独立变量、函数的,都默认是成员了,this 就多余了。
    Python 没有专门的声明变量的语句,不加 self 会认为你是在声明变量。
    还有 JS,过去也有 with(this)这种写法,要到运行期才能知道是成员变量还是外部变量,会使得代码运行结果不可预知,也不利于性能优化。现在只能用 this 访问成员,不允许用 with 语句了。
    EggtartZ
        28
    EggtartZ  
       2021-03-19 08:59:15 +08:00   ❤️ 1
    我就在 vtk 里见过加 this 的
    sutra
        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
    QBugHunter
        30
    QBugHunter  
       2021-03-19 17:08:01 +08:00
    @levelworm
    py 不是 self 嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4259 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:25 · PVG 13:25 · LAX 22:25 · JFK 01:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.