问:

类成员的命名 后面加下划线是 最佳实际? streamId_ 还是 m_streamId 还是其它命名方法?

这是一个非常好的问题,涉及到 ​​C++ 中类成员变量命名的风格与最佳实践​​。

你提到的几种命名方式:

  • streamId_(后缀下划线)

  • m_streamId(前缀 m_

  • 其它可能的风格,比如:

    • streamId(无特别标记,靠约定或注释区分)

    • _streamId(前缀下划线,但需谨慎!)

    • mStreamId(驼峰,加 m前缀,但不常见)

    • this->streamId(通过 this->明确指示成员变量,不依赖命名)


✅ 总结一句话:

​在 C++ 中,没有官方强制规定的成员变量命名规范,但业界存在一些广泛接受的最佳实践。其中:​

  • streamId_(后缀下划线)和 m_streamId(前缀 m_)都是非常常见且合理的命名风格。​

  • ​推荐选择一种你自己或团队最易读、最一致的命名风格,并保持统一。​


一、常见的 C++ 成员变量命名风格

命名风格

示例

说明

是否推荐

备注

​后缀下划线​

streamId_

在变量名后加 _表示成员变量

✅ ​​广泛使用,推荐​

Google C++ Style、LLVM 等常用

​前缀 m_​

m_streamId

m代表 "member",加在变量名前

✅ ​​非常常见,推荐​

Qt、部分传统 C++ 项目常用

​无特殊标记​

streamId

和局部变量同名,靠上下文或注释区分

⚠️ ​​容易混淆,不推荐(除非有清晰规范)​

一些小型项目或脚本风格代码

​前缀下划线​

_streamId

变量名前加 _

⚠️ ​​不推荐(有风险)​

C++ 标准保留部分前导下划线标识符给编译器/标准库

​驼峰 + m 前缀​

mStreamId

类似 Java 风格

⚠️ ​​较少见,可接受但不主流​

有些代码库会这么用

​this-> 指明​

this->streamId

通过 this->明确指示成员变量

✅ ​​可行,但不解决命名冲突根本问题​

通常配合无特殊标记的成员变量使用


二、推荐风格(基于业界实践)

✅ 推荐 1:​​后缀下划线(如 streamId_)​

  • ​风格示例:​

    class DataPublisher {
    private:
        int streamId_;
        std::shared_ptr<DataBuffer> dataBuffer_;
        std::string dataFolderPath_;
    };
  • ​优点:​

    • 清晰表明是成员变量

    • 与局部变量区分明确(尤其是同名时)

    • 不会与关键字/保留标识符冲突

    • 被 ​​Google C++ Style Guide​​、​​LLVM​​、​​Chromium​​ 等广泛采用

  • ​推荐指数:⭐⭐⭐⭐⭐​


✅ 推荐 2:​​前缀 m_(如 m_streamId)​

  • ​风格示例:​

    class DataPublisher {
    private:
        int m_streamId;
        std::shared_ptr<DataBuffer> m_dataBuffer;
        std::string m_dataFolderPath;
    };
  • ​优点:​

    • 也很常见,尤其在一些老的 C++ 项目、Qt 项目中

    • 表意清晰:m= member

    • 易于区分成员变量与局部变量

  • ​推荐指数:⭐⭐⭐⭐​

  • ​注意:​

    • 有些人觉得 m_前缀有点冗余或不够 “现代 C++”

    • 如果你或团队已经习惯这种风格,完全可以使用,没有问题


三、不推荐的风格(有潜在问题)

⚠️ 不推荐 1:​​前导下划线(如 _streamId)​

  • ​示例:​

    class DataPublisher {
    private:
        int _streamId;  // 不推荐!
    };
  • ​为什么不推荐?​

    • C++ 标准 ​​保留了一些以下划线开头的标识符(特别是以下划线开头后跟大写字母,或全局作用域中的下划线变量)给编译器/标准库使用​

    • 虽然类作用域中的 _var通常不会立即冲突,但 ​​为了避免任何潜在问题,最好避免使用前导下划线​

    • 很多 style guide(如 Google)​​明确禁止使用前导下划线​

  • ​推荐指数:⭐(尽量避免)​


⚠️ 不推荐 2:​​无特殊标记(如 streamId)​

  • ​示例:​

    class DataPublisher {
    private:
        int streamId;  // 和局部变量同名,容易混淆
    };
  • ​问题:​

    • 如果成员变量和函数参数或局部变量同名(比如在构造函数里),非常容易混淆

    • 可读性差,尤其在函数内赋值时:streamId = streamId;(哪个是成员?哪个是参数?)

  • ​除非你有非常清晰的编码规范/上下文/注释,否则不推荐​

  • ​推荐指数:⭐(不推荐)​


四、其他可行方式(补充)

✅ 使用 this->明确成员变量(但不替代好的命名规范)

  • 你可以不使用任何特殊命名,而是通过 this->来指明成员变量:

    this->streamId = 123;
  • ​优点:​

    • 不需要依赖命名约定

    • 适用于所有风格

  • ​缺点:​

    • 冗余,代码稍显啰嗦

    • 不能解决命名冲突的视觉混淆问题

    • 通常配合无特殊标记的成员变量使用,但一般不推荐依赖此方式作为主要手段


五、业界常见 Style Guide 推荐

Guide

成员变量命名风格

说明

​Google C++ Style Guide​

stream_id_(后缀下划线,通常小写下划线风格)

推荐后缀 _,变量名小写+下划线

​LLVM​

stream_id_(后缀下划线)

同上,非常一致

​Qt​

m_streamId(前缀 m_,驼峰)

Qt 框架大量使用 m_前缀

​Chromium / Blink​

stream_id_(后缀下划线)

类似 Google 风格

​Bjarne Stroustrup(C++ 之父)​

无强制,但倾向于清晰可读的命名

通常也推荐某种后缀/前缀


✅ 总结推荐(适合大多数 C++ 项目)

风格

示例

推荐度

适用场景

​后缀下划线(推荐 ✅)​

streamId_data_folder_path_

⭐⭐⭐⭐⭐

​最通用、最清晰、被很多大项目采用,如 Google、LLVM​

​前缀 m_(推荐 ✅)​

m_streamIdm_dataBuffer

⭐⭐⭐⭐

常见于传统 C++、Qt 项目,也很清晰

​无标记(不推荐 ⚠️)​

streamId

容易混淆,除非有极强上下文/规范

​前导下划线(不推荐 ⚠️)​

_streamId

有保留风险,不建议使用

​this-> 指明(辅助手段)​

this->streamId

⭐⭐

不替代命名规范,但可辅助区分


✅ 如果你要选择一个风格,我的建议是:

✅ ​​推荐使用:streamId_(后缀下划线)​

  • 理由:

    • 清晰、易读、不易混淆

    • 被很多大型开源 C++ 项目采用(如 Google、LLVM、Chromium)

    • 不会与语言保留标识符冲突

    • 配合良好代码格式,可读性极佳

示例:

class DataPublisher {
public:
    DataPublisher(int stream_id,
                  const std::shared_ptr<DataBuffer>& data_buffer,
                  const std::string& data_folder_path = "");

private:
    int streamId_;                      // 推荐:后缀下划线
    std::shared_ptr<DataBuffer> dataBuffer_;
    std::string dataFolderPath_;
};

或者更语义化一点:

class DataPublisher {
private:
    int streamId_;                    // 流 ID
    std::shared_ptr<DataBuffer> buffer_;  // 数据缓冲区
    std::string outputFolderPath_;    // 输出文件夹路径
};

✅ 总结一句话:

在 C++ 中,​​给类成员变量加后缀下划线(如 streamId_)或前缀 m_(如 m_streamId)都是非常常见且合理的命名风格,都属于最佳实践。推荐优先使用 streamId_(后缀下划线),因其更通用、更清晰、被广泛采用且无潜在风险。​


🔧 ​​如你团队有既定风格(比如用 m_),遵循团队规范更重要,保持一致性是关键!如果你有更多关于命名规范、代码风格、类设计的问题,欢迎继续提问 😊。​

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐