当前位置: 首页 > news >正文

类与面向对象

1、从面向过程到面向对象
在面向过程的结构化程序设计中,程序模块有函数构成,函数将进行数据处理的语句放在函数体内,完成特定的功能,数据则通过函数参数传递进入函数体。在面向对象的程序设计中,程序模块是由类构成的。类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。
2、类的定义
简单地讲,类是一个包含函数的结构体,因此类的定义和结构类型的定义相似,其格式如下:

class类名 {
public:
公有数据成员或公有函数成员的定义;
protected:
保护数据成员和保护函数成员的定义;
private:
私有数据成员或私有函数成员的定义; }

其中:
关键字class表明定义的是一个类。
类名是类的名称,应该是一个合法的标识符。
public、protected、private为存取控制属性(访问权限),用来控制对类的成员的存取,如果前面没有标明访问权限,默认访问权限为private。
类的成员有数据成员和函数成员两类,类的数据成员和函数成员统称为类的成员,类的数据成员一般用来描述类对象的静态属性,称为属性;函数成员用来描述类型或动态属性,称为方法。函数成员由函数构成,这些作为类成员的函数因此也成为成员函数。
注意:
在C++中,class和struct都可以有成员函数,包括各类构造函数、析构函数、成员函数,并且都可以有public、protected、private修饰符。
class的成员默认是private权限,struct的成员默认是public权限。
从编程习惯的角度而言,C++的struct中包含数据成员不包含成员函数,是一种用户自定义的数据结构,体现的是面向过程的编程思想,而class既包含数据成员也包含函数成员,是数据对数据的操作行为的封装,体现的是面向对象的编程思想。
C语言中没有class
(1) 数据成员
类定义中的数据成员描述了类对象所包含的数据类型,数据成员可以是c++基本数据类型,也可以是构造数据类型。
例1:

struct Record
{
char name[20];
int score;
};
class Team{
private:
int num; //基本数据类型
Record*p; //构造数据类型
};

定义的类Team既包含基本数据类型,也包含构造数据类型。
注意:
因为类只是一种类型,类中的数据成员不占内存空间,因此在定义数据成员时不能给数据成员赋初值。
类的数据成员除了可以使用前面讲述的c++类型外,还可以使用已定义的类类型。
在正在定义的类中,由于该类型没有定义完,所以不能定义该类类型的变量,只能定义该类类型的指针成员以及该类类型的引用成员。
例:

class Team; class Grade{
Team a;
Grade*p;
Grade&r;
Grade b;
};

(2)成员函数
作为类成员的成员函数描述了对类中的数据成员实施的操作。成员函数的定义、声明格式与非成员函数(全局函数)的格式相同。成员函数可以放在类中定义,也可以放在类外定义,放在类中定义的成员函数为内联函数。Clock类中的成员函数就是放在类中定义的。
C++可以在类中声明成员函数的原型,在类外定义函数体。这样做的好处是相当于在类中列了一个函数功能表,是我们对类的成员函数的功能一目了然,避免了在个函数实现的一大堆代码中查找函数的定义。在类中声明函数原型的方法与一般函数原型的声明一样,在类外定义函数体的格式如下:

返回值类型 类名::成员函数名(形参表)
{
函数体;
}

其中,::是类的作用域分辨符,用在此处,放在类名后、成员函数前,表明后面的成员函数属于前面的那个类。
Clock类中的成员函数可以在类中声明:

class Clock{
private:
int H,M,S;
public:
void SetTime(int h,int m,int s);
void ShowTime();
};

在类外实现成员函数如下:

void Clock::SetTime(int h,int m,int s)
{
H=h,M=m,S=s;
}
void Clock::ShowTime()
{
cout<<H<<“:”<<M<<“:”<<S<<endl;
}

如果要将在类外定义的成员函数编译成内联函数,可以在类外定义函数时,在函数的返回类型前加上inline。下面ShowTime()定义成内联函数,与在类中定义成员函数的效果相同。

intline voidClock::ShowTime()
{
cout<<H<<“:”<<S<<endl;
}

注意:
在成员函数中不仅可以自由使用类的成员,还可以使用该定义变量(对象),通过变量使用成员。其原因是函数在调用时才在内存中建立函数体中的变量(包含实参),这是类已经定义完毕,当然可以使用完定义完的类类型的变量。
例如,在Clock类中可以定义成员函数AddTime():

class Clock{
private:
int H,M,S;
public:
Clock AddTime(Clock C2){ //形参为Clock类型的变量
Clock T; //在函数体中定义了Clock型的变量

return T; //返回类型为Clock类型
} };

3类作用域
类是一组数据成员和函数成员的集合,类作用域作用于类中定义的特定成员,包括数据成员与成员函数,类中的每一个成员都具有类作用域。实际上,类的封装作用也就是限制类的成员的访问范围局限与类的作用域之内。
4对象的建立与使用
类相当于一种包含函数的自定义数据类型,它不占内存,是一个抽象的”虚”体,使用已定义的类建立对象就想用数据类型定义变量一样。对象在建立后,对象占据内存,变成了一个“实”体,类与对象的关系就像数据类型与变量的关系一样。其实,一个变量就是一个简单的不含成员函数的数据类型。
建立对象的格式如下:

类名 对象名;

其中,对象名可以是简单的标识符,也可以是数组。
使用

Clock MyClock;

建立一个Clock型的对象MyClock。
在建立对象后,就可以通过对象存取对象中的数据成员,调用成员函数。其存取格式如下:

对象名.属性 对象名.成员函数名(实参1,实参2,…,)

例如,通过对象MyClock使用成员函数SetTime()的方式如下:

MyClock.SetTime(8,30,30);

至于对数据成员H、M、S的存取,引起存取权限为private而被保护,所以不能直接进行存取。

http://www.jsqmd.com/news/740821/

相关文章:

  • 4.28~4.30【Q】
  • 智能自动化抖音评论采集:革命性的双引擎数据提取方案
  • 阅读 Hyperf 的 Server 类,看它如何监听 Swoole 的 onRequest 事件。
  • 从‘人工智障’到‘智能助手’:手把手教你用Python实现一个会‘提问’的主动学习分类器
  • TTS多模态验证系统:语音安全与图像生成技术解析
  • Windows下C语言程序报错3221226356?别慌,手把手教你定位并修复这个内存访问错误
  • 扩散模型与S3-DiT架构:多模态生成式AI技术解析
  • 【RISC-V调试性能瓶颈诊断术】:从CSR读写延迟到调试模块DSCR状态机异常的逐层穿透解析
  • GRADE基准:跨学科图像编辑效果统一评估体系
  • 成本十分之一,性能追平激光雷达?我们拆了一颗国产4D毫米波雷达(含MMIC芯片实拍)
  • AI广告优化:是效率利器,还是隐藏陷阱?深度剖析其可靠性
  • AI/ML安全代码质量评估体系与防护实践
  • 开源机械臂OpenClaw-EcoBot:低成本高自由度机器人开发实践
  • 全域数学视角下N维广义数系的推广与本源恒等式构建【乖乖数学】
  • 2 分钟出稿到 30 分钟出稿,2026 降 AI 软件排行 7 款速度梯队大公开。
  • RePKG终极指南:高效提取Wallpaper Engine资源与专业TEX转换方案
  • 2025网盘下载加速终极指南:八大平台全速下载一键配置实战
  • 保姆级教程:用TIA15和S7-PLCSIM Advanced V4.0搭建S7-1500仿真环境,再连上KEPServerEX 6.5
  • 从零构建命令行窗口管理器:终端复用与TUI开发核心技术解析
  • 华南理工自动化考研814专业课,用对这三本参考书复习效率翻倍(附真题获取渠道)
  • (强烈推荐)麦肯锡:AI 时代,旧的敏捷开发方式正在拖累个人效率
  • 别再为Java环境头疼了!手把手教你搞定CiteSpace 6.2.R4的安装与配置(Windows/Mac通用)
  • AingDesk:本地AI助手桌面应用架构解析与实战部署指南
  • 多模态验证系统:强化学习与跨模态融合的安全实践
  • 项目介绍 基于Python的二手房屋信息的数据分析及可视化设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
  • 从MIPS到TOPS:算力单位进化史,以及为什么今天的AI芯片评测更复杂了
  • 在1GB内存安卓设备上部署AI网关:Node.js交叉编译与内存优化实战
  • AI驱动零代码开发:用Cursor Composer快速构建Next.js导航站
  • DeepSeek 写完用排行前 5 降 AI 软件接力,4 步过维普 AIGC 检测。
  • 换背景怎么换?2026年最全换背景工具测评及使用指南