C++编程时是否有“成员变量全部显式使用 this”的代码风格? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AlexGuo1998
V2EX    C

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

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

    上次阅读 /修改别人代码的时候看到一个类,里面有类似于 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
    itechify
        1
    itechify  
    PRO
       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 ,避免一些坑.

    不过没有看到过类似的建议.
    AV1
        27
    AV1  
       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     Solana     5399 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:14 PVG 16:14 LAX 01:14 JFK 04:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86