IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:struct

共 3 篇相关文章

IT 累计浏览 4,980

struct与class区别联系

这篇讲的是C和C++中`struct`这个看似相同的关键字,其实内核大不相同。作者开篇就指出了核心区别:C中的`struct`是“原生”的,仅仅用来将一组属性打包成一个整体,没有任何面向对象(OO)的特性。而C++中的`struct`则是在此基础上做了深度扩展,它完全兼容C的用法,但更重要的是具备了OO特性——事实上,C++中`class`能干的事情,`struct`几乎都能干,包括继承和多态。 文章通过一个直观的代码示例验证了这一点:如果在纯C环境下(例如用GCC的C模式编译),在`struct`内部直接定义成员函数会导致编译报错;但同样的代码在C++中则毫无问题。这生动地说明了“原生”与“扩展”的差异。 那么,在C++中`struct`和`class`到底还有何区别?唯一的、关键的不同在于默认的访问权限:`struct`默认是`public`,而`class`默认是`private`。这个细微差别决定了代码风格和设计意图。通常,我们用`struct`来封装纯数据的聚合体,而用`class`来定义那些需要隐藏实现细节、提供接口的抽象数据类型。这篇小文通过对比和代码解析,清晰地帮你厘清了这个C++程序员常会遇到的疑惑。

IT 累计浏览 6,223

C语言结构体里的成员数组和指针

这篇讲的是C语言中结构体成员访问的一个经典误解。作者从微博上一道让程序崩溃的代码题出发,拆解了其中隐藏的底层机制。题目里结构体包含零长度数组 `char s[0]`,通过空指针 `f.a` 访问成员 `s` 时,程序没在 `if` 判断崩溃,却在之后的 `printf` 处崩溃。 文章深入剖析了根源:在C语言里,访问结构体成员本质上是进行“基址 + 编译时确定的偏移量”计算。对于数组成员 `s`,`f.a->s` 操作得到的是这个数组的相对地址(通过 `lea` 指令实现),所以即使 `f.a` 是空指针,计算出的地址(如 0x4)也不会立刻引发崩溃。但如果把 `s` 声明为指针 `char *s`,`f.a->s` 则会解引用这个空指针(通过 `mov` 指令),程序就会在判断条件处直接崩溃。作者还澄清了零长度数组是编译器扩展(如GCC),常用于实现“柔性数组”以分配不定长数据。 文章强调,理解变量的地址本质、成员访问的偏移计算以及数组名与指针的操作区别,是避免这类“坑”并掌握C语言内存模型的关键。

IT 累计浏览 2,703

C++讲解

这篇讲的是C++对C语言结构体的一次重要功能扩展。作者直接切入两者最核心的差异:在C语言中,结构体(struct)仅用于封装数据,内部不允许定义成员函数;而到了C++,结构体被赋予了更完整的能力,可以像类(class)一样包含函数。 这个改变不仅仅是语法层面的“补全”,它带来了编程范式的演进。C++通过允许结构体承载行为(函数),使得数据与操作其数据的逻辑能够被紧密地组织在一起,这为面向对象编程中“封装”概念的实现铺平了道路。在C++中,`struct`和`class`默认的区别仅在于访问控制(`struct`默认公有,`class`默认私有),而在功能上已趋于一致。 因此,文章点明了C++结构体更适用于需要将数据及其相关操作作为一个整体来管理的场景,而C语言的结构体则专注于纯粹的数据组合。这个对比,清晰地揭示了C++在类型系统设计上的一次重要进化。