C++:类与对象(一) 本文介绍C中类与对象的核心概念。首先讲解类的定义格式、访问限定符public、private、protected以及类域的作用随后介绍对象的实例化过程、对象大小的计算规则并解释空类为何占用一个字节最后说明this指针的隐藏机制及其在成员函数调用中的作用。类类的定义格式C中的类可以简单理解为将一个功能整体打包封装而这个打包好的东西就称之为“类”。类中包含变量和函数它们分别被称之为“成员变量”“成员函数”类的方法。类的定义通过class这个关键字后面接上类的名字比如Stack在加上括号和分号。#define _CRT_SECURE_NO_WARNINGS 1 #include iostream #include assert.h using namespace std; class Stack { public: //成员函数 void Init(int n 4) { _array (int*)malloc(sizeof(int) * n); if (_array NULL) { perror(malloc); return; } _capacity n; _top 0; } void Push(int x) { //扩容 if (_top _capacity) { int* tmp (int*)realloc(_array, sizeof(int) * _capacity * 2); if (tmp NULL) { perror(realloc); return; } _capacity * 2; _array tmp; } _array[_top] x; } int Top() { assert(_top 0); return _array[_top - 1]; } void Destroy() { free(_array); _array nullptr; _top _capacity 0; } private: //成员变量 int* _array; size_t _capacity; size_t _top; };访问限定符我们还可以注意到public和private这两个关键字。它们被称为“访问限定符”。public修饰的成员能在类外访问而private和protected则不能在类外访问。后两者的区别会放在后续谈。需要注意的是如果class定义的成员没有被访问限定符修饰那么就会默认为private而struct则是public。一个习惯是成员变量通常为private而成员函数为public。类域类指定了一个新的作用域。如果你把函数声明放在类中定义放在类外那么定义使用域操作符::指定该定义到底属于那个类。#define _CRT_SECURE_NO_WARNINGS 1 #include iostream #include assert.h using namespace std; class Stack { public: //成员函数 void Init(int n 4) { _array (int*)malloc(sizeof(int) * n); if (_array NULL) { perror(malloc); return; } _capacity n; _top 0; } void Push(int x); int Top() { assert(_top 0); return _array[_top - 1]; } void Destroy() { free(_array); _array nullptr; _top _capacity 0; } private: //成员变量 int* _array; size_t _capacity; size_t _top; }; void Stack::Push(int x) { //扩容 if (_top _capacity) { int* tmp (int*)realloc(_array, sizeof(int) * _capacity * 2); if (tmp NULL) { perror(realloc); return; } _capacity * 2; _array tmp; } _array[_top] x; }在此例中如果不用域操作符Push函数就会被当作全局函数处理。对象类的实例化现实中房屋都有设计图但图中的事物是没有实体的设计而当你按照图纸把它造出来时它才拥有实体。类比到这里类就像设计图它没有实体也就是没有被分配内存只有实例化——创建了对象后那个对象才算是实体才是被分配了内存。int main() { Stack st1;//实例化 st1.Init(); st1.Push(1); st1.Push(2); st1.Push(3); st1.Push(4); st1.Push(5); cout st1.Top() endl; st1.Destroy(); return 0; }这里顺带说一下实例化出的对象包含每个成员变量但不包含函数也没有存储它们的指针。毕竟函数总是一样的如果每个对象都包含函数会非常浪费空间。再一个指针本质上是地址编译器会在编译链接时找到函数地址将调用函数编译为汇编指令而不是在运行时找。对象的大小对象既然有实体那就必然有大小。它的大小计算方式和结构体类似具体如下1.第一个成员对齐在偏移量为零处。2.其它成员对齐到对齐数的整数倍的地址处。对齐数为默认对齐数和该成员大小的较小值VS默认对齐数是83.总大小为最大对齐数的整数倍4.如果嵌套了结构体那么嵌套的结构体对齐到自身最大对齐数的地址处整个结构体的大小为包含了嵌套结构体成员的最大对齐数的整数倍。我们来看下面例子#include iostream #include assert.h using namespace std; class A { public: void Print() { cout _ch endl; } private: char _ch; int _i; }; class B { public: void Print() { } }; class C { }; int main() { A a; B b; C c; cout sizeof(a) endl; cout sizeof(b) endl; cout sizeof(c) endl; return 0; }最终算出结果为8 1 1我们发现在类中即使没有成员变量大小仍然会有一个字节。毕竟如果一个字节都不给怎么证明这个对象存在过这里给一个字节是为了保证不同对象有不同的地址。this指针在刚刚的stack类的例子中如果我们实例化出两个对象st1st2那么它们所包含的函数都是相同的可问题在于函数体中似乎没有区分对象的功能那在调用时它究竟是如何决定我是该拿st1的数据还是st2的数据的呢其实每个成员函数的第一个形参隐藏了一个this指针参数用它来访问对应对象的成员变量字面意思上的告诉函数是”这个“对象。比如stack的Init的真面目时是void Init(Stack* const this, int n 4) { this-_array (int*)malloc(sizeof(int) * n); if (this-_array NULL) { perror(malloc); return; } this-_capacity n; this-_top 0; }注意C规定不能再实参和形参位置上显示地写this指针但是我们可以在函数体内部显示使用this指针。

相关新闻

最新新闻

医疗数据治理实战:从CMID到JSON的完整转换流程与Python实现

医疗数据治理实战:从CMID到JSON的完整转换流程与Python实现

简介:本资源为CMID临床医学信息数据库的标准化JSON数据文件,面向医学信息学研究者、医疗IT开发人员及健康大数据分析初学者,解决临床数据结构化提取与跨系统交换的实际需求。压缩包仅含1个核心JSON文件(1.05MB)&#x…

2026/9/2 8:43:14
从零构建充电插口数据集:YOLOv8实战与工业部署全解析

从零构建充电插口数据集:YOLOv8实战与工业部署全解析

简介:本资源是面向智能网联汽车与计算机视觉初学者的充电接口识别专用数据集,聚焦新能源汽车GB/T标准下的AC交流与DC直流两类充电插口检测任务,适用于YOLOv8目标检测模型训练与部署验证。数据包共2000个文件,包含1191张高质量JPG图…

2026/9/2 8:43:14
SpringAI环境配置实战:从零搭建稳定可复现的大模型集成开发环境

SpringAI环境配置实战:从零搭建稳定可复现的大模型集成开发环境

如果你正在尝试将大模型能力集成到你的 Spring Boot 应用中,却卡在了第一步——环境配置上,那么这篇文章就是为你准备的。SpringAI 作为 Spring 官方推出的 AI 应用开发框架,其核心价值在于让 Java 开发者能以熟悉的 Spring 风格,…

2026/9/2 8:43:14
从零构建React+TypeScript抽屉组件:类型安全与工程实践

从零构建React+TypeScript抽屉组件:类型安全与工程实践

这次我们来看一个前端开发中非常实用的组件:用 React 和 TypeScript 编写一个抽屉组件。抽屉组件是侧边滑入的模态面板,在管理后台、移动端导航、详情展示等场景应用广泛。很多开发者会直接使用 Ant Design 或 MUI 等现成库,但自己动手实现一…

2026/9/2 8:43:14
在毕业设计中,我是如何选择合适的工具来提高效率的?

在毕业设计中,我是如何选择合适的工具来提高效率的?

在毕业设计中,我是如何选择合适的工具来提高效率的? 作为一名计算机专业的毕业设计学生,我在开发、作图、文档整理和论文收尾的过程中,深刻体会到选择合适的工具对提高效率的重要性。以下是我在这些任务中遇到的真实痛点&#xf…

2026/9/2 8:43:14
Java设计模式教学实践:MVC与观察者模式详解

Java设计模式教学实践:MVC与观察者模式详解

简介:本资源是《软件设计与体系结构》课程配套实践材料,面向高校计算机相关专业本科生及软件工程学习者,聚焦设计模式、MVC架构、观察者模式、状态模式等核心概念的代码实现与案例演练。压缩包含458个文件,主体为451个Java源码文件…

2026/9/2 8:38:14