C++_类成员命名规范
问:
类成员的命名 后面加下划线是 最佳实际? streamId_ 还是 m_streamId 还是其它命名方法?
这是一个非常好的问题,涉及到 C++ 中类成员变量命名的风格与最佳实践。
你提到的几种命名方式:
-
streamId_(后缀下划线) -
m_streamId(前缀m_) -
其它可能的风格,比如:
-
streamId(无特别标记,靠约定或注释区分) -
_streamId(前缀下划线,但需谨慎!) -
mStreamId(驼峰,加m前缀,但不常见) -
this->streamId(通过this->明确指示成员变量,不依赖命名)
-
✅ 总结一句话:
在 C++ 中,没有官方强制规定的成员变量命名规范,但业界存在一些广泛接受的最佳实践。其中:
streamId_(后缀下划线)和m_streamId(前缀m_)都是非常常见且合理的命名风格。推荐选择一种你自己或团队最易读、最一致的命名风格,并保持统一。
一、常见的 C++ 成员变量命名风格
|
命名风格 |
示例 |
说明 |
是否推荐 |
备注 |
|---|---|---|---|---|
|
后缀下划线 |
|
在变量名后加 |
✅ 广泛使用,推荐 |
Google C++ Style、LLVM 等常用 |
|
前缀 m_ |
|
|
✅ 非常常见,推荐 |
Qt、部分传统 C++ 项目常用 |
|
无特殊标记 |
|
和局部变量同名,靠上下文或注释区分 |
⚠️ 容易混淆,不推荐(除非有清晰规范) |
一些小型项目或脚本风格代码 |
|
前缀下划线 |
|
变量名前加 |
⚠️ 不推荐(有风险) |
C++ 标准保留部分前导下划线标识符给编译器/标准库 |
|
驼峰 + m 前缀 |
|
类似 Java 风格 |
⚠️ 较少见,可接受但不主流 |
有些代码库会这么用 |
|
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 |
|
推荐后缀 |
|
LLVM |
|
同上,非常一致 |
|
Qt |
|
Qt 框架大量使用 |
|
Chromium / Blink |
|
类似 Google 风格 |
|
Bjarne Stroustrup(C++ 之父) |
无强制,但倾向于清晰可读的命名 |
通常也推荐某种后缀/前缀 |
✅ 总结推荐(适合大多数 C++ 项目)
|
风格 |
示例 |
推荐度 |
适用场景 |
|---|---|---|---|
|
后缀下划线(推荐 ✅) |
|
⭐⭐⭐⭐⭐ |
最通用、最清晰、被很多大项目采用,如 Google、LLVM |
|
前缀 m_(推荐 ✅) |
|
⭐⭐⭐⭐ |
常见于传统 C++、Qt 项目,也很清晰 |
|
无标记(不推荐 ⚠️) |
|
⭐ |
容易混淆,除非有极强上下文/规范 |
|
前导下划线(不推荐 ⚠️) |
|
⭐ |
有保留风险,不建议使用 |
|
this-> 指明(辅助手段) |
|
⭐⭐ |
不替代命名规范,但可辅助区分 |
✅ 如果你要选择一个风格,我的建议是:
✅ 推荐使用: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_),遵循团队规范更重要,保持一致性是关键!如果你有更多关于命名规范、代码风格、类设计的问题,欢迎继续提问 😊。
更多推荐


所有评论(0)