news 2026/1/25 7:53:46

C++入门讲解5:类与对象全解析从基础语法到实战应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++入门讲解5:类与对象全解析从基础语法到实战应用

目录

一、类与对象的核心关系

二、类的声明与对象定义

1. 类的声明格式

2. 对象的定义

三、类的成员访问方式

1. 对象名 + 成员运算符(.)

2. 对象指针(->)

3. 对象引用(&)

四、类的封装与信息隐藏

1. 封装的核心思想

2. 多文件分离实现(推荐实践)

五、构造函数与析构函数

1. 构造函数:对象的“初始化器”

常用形式:

2. 析构函数:对象的“清理工”

调用时机与顺序:

六、实战练习:求3个长方体的体积

需求:

参考代码:


作为C++面向对象编程的核心,“类与对象”是告别面向过程思维的关键。本文基于系统的知识点梳理,从概念到实战,带大家一步步掌握类的声明、成员操作、封装特性、构造/析构函数等核心内容,最后附上实验报告模板与提交要求,助力新手快速上手~

一、类与对象的核心关系

  • :是对象的抽象模板,描述某一批对象的共同特性(如“长方体”类定义了长、宽、高等属性和计算体积的方法),不占用内存空间。

  • 对象:是类的具体实例(如“第一个长方体”“第二个长方体”),占用内存,具备类定义的所有属性和行为。

  • 类比理解:类是“手机设计图纸”,对象是根据图纸生产的具体手机。

二、类的声明与对象定义

1. 类的声明格式

类的声明类似结构体,关键字由struct改为class,包含私有(private)和公有(public)成员,必须以分号结束:

class 类名 { private: // 私有数据成员和成员函数(类外不可直接访问) 数据类型 成员变量名; 返回值类型 成员函数名(参数); public: // 公共数据成员和成员函数(类外可访问,是对外接口) 数据类型 成员变量名; 返回值类型 成员函数名(参数); };

示例(矩形类):

class Rectangle { private: int length, width, area, perimeter; // 私有属性,类外不可直接修改 public: void CalculateArea() { area = length * width; } // 计算面积 void CalculatePerimeter() { perimeter = (length + width) * 2; } // 计算周长 void Display() { // 输出属性 cout << "长:" << length << endl; cout << "宽:" << width << endl; cout << "面积:" << area << endl; cout << "周长:" << perimeter << endl; } };

2. 对象的定义

声明类后,通过以下格式定义对象(class关键字可省略):

类名 对象名1, 对象名2, ...;

示例:

Rectangle rect1, rect2; // 定义两个矩形对象

三、类的成员访问方式

类的成员(变量/函数)需通过特定方式访问,核心规则:类外只能直接访问公有成员,私有成员需通过公有成员函数间接访问

1. 对象名 + 成员运算符(.)

最常用的访问方式,格式:对象名.成员变量名/对象名.成员函数名()

#include <iostream> #include <string> using namespace std; class Worker { public: int num; string name; float salary; void Show() { // 公有成员函数 cout << "工号:" << num << endl; cout << "姓名:" << name << endl; cout << "工资:" << salary << endl; } }; int main() { Worker work1; work1.num = 1; // 访问公有成员变量 work1.name = "张三"; work1.salary = 4000; work1.Show(); // 调用公有成员函数 return 0; }

运行结果:

工号:1 姓名:张三 工资:4000

2. 对象指针(->)

通过指针指向对象,间接访问成员,格式:指针变量->成员变量名

int main() { Worker work1, *p; p = &work1; // 指针指向对象 p->num = 2; p->name = "李四"; p->salary = 5000; p->Show(); return 0; }

3. 对象引用(&)

引用是对象的别名,与对象共享内存,访问方式同对象名:

int main() { Worker work1; Worker &work2 = work1; // work2是work1的别名 work2.num = 3; work2.name = "王五"; work1.Show(); // 输出work2的赋值结果 return 0; }

四、类的封装与信息隐藏

1. 封装的核心思想

将类的私有实现(数据成员)与公有接口(成员函数)分离:

  • 私有成员(private):隐藏内部数据,防止外界误操作(如直接修改矩形的长为负数)。

  • 公有成员函数:作为对外唯一接口,间接操作私有成员,保证数据合法性。

2. 多文件分离实现(推荐实践)

当类被多个程序复用,建议将“类声明”和“成员函数实现”分离到不同文件:

  • 头文件(.h):存放类声明(如Rectangle.h)。

  • 源文件(.cpp):存放成员函数实现(如Rectangle.cpp)。

  • 主程序(main.cpp):包含头文件,使用类。

示例:

// Rectangle.h

class Rectangle { private: int length, width; public: void SetValue(int l, int w); void DisplayArea(); };

// Rectangle.cpp

#include <iostream> #include "Rectangle.h" using namespace std; void Rectangle::SetValue(int l, int w) { // 域限定符::指定所属类 length = l; width = w; } void Rectangle::DisplayArea() { cout << "面积:" << length * width << endl; }

// main.cpp

#include <iostream> #include "Rectangle.h" using namespace std; int main() { Rectangle rect; rect.SetValue(5, 4); rect.DisplayArea(); // 输出:面积:20 return 0; }

五、构造函数与析构函数

1. 构造函数:对象的“初始化器”

作用:定义对象时自动调用,初始化对象的私有成员(解决私有成员无法直接赋值的问题)。

核心特性:

  1. 函数名与类名完全一致。

  2. 无返回类型(包括void)。

  3. 可重载(多个构造函数,参数表不同)。

  4. 未自定义时,系统自动生成空构造函数。

常用形式:

无参构造函数(默认初始化):

class Time { private: int hour, minute, second; public: Time() { // 无参构造函数 hour = 0; minute = 0; second = 0; } };

带参构造函数(自定义初始化):

class Box { private: int length, width, height; public: Box(int l, int w, int h) { // 带参构造 length = l; width = w; height = h; } int Volume() { return length * width * height; } }; // 调用: Box box1(1,2,3); cout << "体积:" << box1.Volume() << endl; // 输出:6

参数初始化表(更简洁的初始化):

Box(int l, int w, int h) : length(l), width(w), height(h) { }

重载构造函数(多种初始化选择):

class Circle { private: float radius; public: Circle() { radius = 10.0; } // 无参(默认半径10) Circle(float r) { radius = r; } // 带参(自定义半径) float Area() { return 3.14159 * radius * radius; } };

2. 析构函数:对象的“清理工”

作用:对象生命周期结束时自动调用,释放资源(如动态内存、文件句柄)。

核心特性:

  1. 函数名前加~,与类名一致。

  2. 无返回类型、无参数、不可重载。

  3. 未自定义时,系统自动生成空析构函数。

调用时机与顺序:
  • 局部对象:函数调用结束时调用。

  • 全局对象:程序结束时调用。

  • 动态对象(new创建):delete时调用。

  • 顺序:先构造的后析构,后构造的先析构(类似栈的“先进后出”)。

示例:

class Box { public: Box(int l) { cout << "构造对象,长度:" << l << endl; } ~Box() { cout << "析构对象" << endl; } }; int main() { Box b1(1); // 构造1 Box b2(2); // 构造2 return 0; } // 输出顺序: // 构造对象,长度:1 // 构造对象,长度:2 // 析构对象 // 析构对象

六、实战练习:求3个长方体的体积

需求:

  1. 定义长方体类(Cuboid),数据成员:长、宽、高。

  2. 用成员函数实现:键盘输入3个长方体的尺寸、计算体积、输出结果。

参考代码:

#include <iostream> using namespace std; class Cuboid { private: int length, width, height; public: void Input() { // 输入尺寸 cout << "请输入长、宽、高:"; cin >> length >> width >> height; } int Volume() { return length * width * height; } }; int main() { Cuboid c1, c2, c3; c1.Input(); c2.Input(); c3.Input(); cout << "长方体1体积:" << c1.Volume() << endl; cout << "长方体2体积:" << c2.Volume() << endl; cout << "长方体3体积:" &lt;&lt; c3.Volume() &lt;&lt; endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/22 19:44:41

Dify支持的多种大模型接入方式及适配技巧

Dify支持的多种大模型接入方式及适配技巧 在今天的企业AI实践中&#xff0c;一个现实问题摆在面前&#xff1a;我们手握多个大语言模型——有云端的GPT-4、Claude 3&#xff0c;也有本地跑着的Llama 3和ChatGLM&#xff1b;每个模型各有优势&#xff0c;但接口不一、格式各异、…

作者头像 李华
网站建设 2026/1/22 18:06:25

MobaXterm专业版功能体验:3分钟快速了解完整功能

MobaXterm专业版功能体验&#xff1a;3分钟快速了解完整功能 【免费下载链接】MobaXterm-Keygen MobaXterm Keygen Originally by DoubleLabyrinth 项目地址: https://gitcode.com/gh_mirrors/mob/MobaXterm-Keygen 还在为MobaXterm专业版的功能特性而好奇吗&#xff1f…

作者头像 李华
网站建设 2026/1/24 2:33:27

从环境搭建到API调用:Open-AutoGLM部署完整路径拆解

第一章&#xff1a;智普Open-AutoGLM部署教程环境准备 在部署智普AI推出的Open-AutoGLM模型前&#xff0c;需确保系统具备以下基础环境。推荐使用Linux操作系统&#xff08;如Ubuntu 20.04&#xff09;&#xff0c;并配置Python 3.9及以上版本。安装依赖管理工具&#xff1a;建…

作者头像 李华
网站建设 2026/1/23 14:13:00

AMD显卡AI图像生成终极指南:ComfyUI-Zluda快速上手教程

还在为AMD显卡在AI创作中的性能瓶颈而困扰吗&#xff1f;ComfyUI-Zluda通过创新的ZLUDA技术&#xff0c;让AMD用户也能享受到流畅高效的AI图像生成体验。本教程将带您从零开始&#xff0c;快速掌握这款强大的AI创作工具。 【免费下载链接】ComfyUI-Zluda The most powerful and…

作者头像 李华
网站建设 2026/1/23 16:01:54

2025年GEMMA基因组分析完整指南:从入门到精通的高效GWAS工具

基因组分析是现代生物信息学研究的核心技术之一&#xff0c;而GEMMA作为一款专为基因组关联分析设计的强大GWAS工具&#xff0c;能够帮助你高效处理大规模基因数据&#xff0c;发现基因型与表型之间的隐藏关联。无论你是初学者还是经验丰富的生物信息学家&#xff0c;本指南都将…

作者头像 李华
网站建设 2026/1/23 14:56:58

基于jflash的工业固件烧录:操作指南

工业级固件烧录实战&#xff1a;如何用 JFlash 打造稳定高效的量产流程 在一条自动化产线的尽头&#xff0c;一台嵌入式设备完成最后的组装。工人将它轻轻放入测试夹具——几秒后&#xff0c;绿色指示灯亮起&#xff0c;设备启动&#xff0c;屏幕显示正常。这个看似简单的动作…

作者头像 李华