c++中struct和class有什么区别_c++结构体与类对比【详解】
技术百科
裘德小鎮的故事
发布时间:2026-01-26
浏览: 次 struct成员默认public,class默认private;struct继承默认public,class默认private;struct倾向POD类型和C兼容,class强调封装与资源管理。
默认访问权限不同:不写 public 就会出问题
这是唯一影响编译行为的语法级区别。struct 成员默认 public,class 默认 private。你写 struct S { int x; };,外部可以直接用 s.x = 42;;但换成 class C { int x; };,同一行代码直接报错:error: 'int C::x' is private。
- 修复方式很简单:显式加
public:或private:,两者立刻行为一致 - 新手常踩的坑:把
class当成“必须封装”,结果忘了加public:导致接口不可见;或把struct当成“不能有函数”,其实它完全可以定义构造函数、operator==甚至虚函数 - 真正该警惕的不是能不能,而是“为什么这里用了
struct却有一堆private成员”——这会让协作者困惑设计意图
继承时默认方式不同:影响多态和模板推导
不写继承修饰符时,struct D : B {} 等价于 struct D : public B {};而 class D : B {} 等价于 class D : private B {}。这个差异在接口传递和模板匹配中会悄悄暴露:
-
private继承会切断基类的公有接口,比如class D : B {}后,D对象无法隐式转为B&,传给接受B&的函数会编译失败 - 模板特化时关键字必须严格匹配:如果声明是
template,特化就必须写struct Container; template struct Container,写成{}; template class Container会报错{}; - 实际项目中建议始终显式写出
public/private,避免靠默认值埋雷
语义与 ABI 兼容性:选错关键字可能影响二进制接口
虽然功能完全等价,但社区约定深刻影响实际使用:
-
struct天然倾向 POD 类型(无虚函数、无用户定义构造/析构),适合跨语言交互(如 C 接口)、内存拷贝(memcpy)、网络协议结构体 -
暗示封装逻辑,比如
class
std::vector有私有指针、自定义析构、分配器策略——看到它你就该想到资源管理 - ABI 层面:带虚表或非 trivial 构造的
class可能改变对象布局;而纯struct更易保证标准布局(standard-layout),这对序列化、reinterpret_cast很关键
什么时候该用 struct,什么时候该用 class
别纠结“能力边界”,看设计意图:
- 用
struct:配置项(struct Config { std::string host; int port; };)、几何类型(struct Vec3 { float x,y,z; };)、C 兼容结构(struct sockaddr_in)——强调“它是什么” - 用
class:需要控制生命周期(class FileHandle)、校验输入(class Temperature { private: double celsius; public: void set_celsius(double); };)、支持多态(有虚函数)——强调“它能做什么” - 最危险的信号:一个
struct里既有private:成员,又有复杂构造函数,却没有注释说明为什么破例——这种模糊会拖慢整个团队的理解成本
真正的复杂点不在语法,而在团队对“struct 意味着简单数据”这一共识的依赖程度。一旦打破,就得靠文档和命名来补救,而人总是倾向于跳过文档。
# ai
# 就会
# 这是
# 这一
# 文档
# 什么时候
# 特化
# public
# Error
# 对象
# 堆
# c++
# String
# int
# double
# void
# class
# 资源管理
# 区别
# 指针
# 构造函数
# 接口
# 报错
# 为什么
# private
# operator
# 封装
# 结构体
# 继承
# Struct
# 多态
# 虚函数
# 该用
# Float
# 不写
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++中如何求一个数的平方根_c++ sqrt函数
- php485读数据时阻塞怎么办_php485非阻塞
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- 如何使用Golang log设置日志输出格式_Go
- Windows 11如何查看系统激活密钥_Wind
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Win11怎么关闭边缘滑动手势_Windows11
- Win10怎么关闭自动更新错误弹窗_Win10策略
- php怎么连接数据库_MySQL数据库连接的基础代
- 如何在Golang中编写异步函数测试_Golang
- 如何使用Golang反射创建map对象_动态生成键
- c# Task.Yield 的作用是什么 它和Ta
- Windows10系统怎么查看显卡驱动_Win10
- c++怎么编写动态链接库dll_c++ __dec
- 如何在 Go 中正确测试带 Cookie 的 HT
- Mac如何设置动态壁纸?(让桌面动起来)
- php怎么下载安装并配置环境变量_命令行调用PHP
- 如何使用Golang理解结构体指针方法接收者_Go
- c++ namespace命名空间用法_c++避免
- Win10怎样安装Word样式库_Win10安装W
- 如何从 Go 的 map[string]inter
- Python文件管理规范_工程实践说明【指导】
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- php查询数据怎么导出csv_查询结果转csv文件
- 如何使用Golang实现负载均衡_分发请求到多个服
- c++获取当前时间戳_c++ time函数使用详解
- Linux怎么查找死循环进程_Linux系统负载分
- Win11怎么设置右键刷新选项_Windows11
- mac怎么安装pip_MAC Python pip
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- windows 10专注助手怎么关闭_window
- Win11怎么恢复出厂设置_Win11重置此电脑保
- 如何在Golang中实现自定义Benchmark_
- c++23 std::expected怎么用 c+
- Win10如何卸载预装Edge扩展_Win10卸载
- Win11视频默认播放器怎么改_Win11关联第三
- Win11如何卸载OneDrive_Win11卸载
- 如何在Golang中配置代码格式化工具_使用gof
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- 如何在 Go 中判断变量是否为函数类型
- Windows任务计划服务异常原因_任务调度失败的
- 如何在Golang中实现RPC异步返回_Golan
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Win11关机快捷键是什么_Win11快速关机方法
- VSC怎样在Linux运行PHP_Ubuntu系统
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Windows10如何更改计算机工作组_Win10
- 如何优化Golang内存分配与GC调度_Golan
- Win11怎么关闭通知消息_屏蔽Windows 1
- VSC怎么配置PHP的Xdebug_远程调试设置步


QQ客服