news 2026/5/23 11:15:21

C++类和对象基础详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++类和对象基础详解

一、类和对象的基本概念

结构化程序设计

C语言使用结构化程序设计:

程序 = 数据结构 + 算法

程序由全局变量以及众多相互调用的函数组成 。算法以函数的形式实现,用于对数据结构进行操作。

结构化程序设计的不足

1.结构化程序设计中,函数和其所操作的数据结构,没有直观的联系。

2.随着程序规模的增加,程序逐渐难以理解,很难一下子看出来:

某个数据结构到底有哪些函数可以对它进行操作?

某个函数到底是用来操作哪些数据结构的?

任何两个函数之间存在怎样的调用关系?

3.结构化程序设计没有“封装”和“隐藏”的概念。 要访问某个数据结构中的某个变量,就可以直接访问,那么当该变量的定义有改动的时候,就要把所有访问该变量的语句找出来修改,十分不利于程序的维护、扩充。

4.难以查错,当某个数据结构的值不正确时,难以找出到底是那个函数导致的。

5.重用:在编写某个程序时,发现其需要的某项功 能,在现有的某个程序里已经有了相同或类似的 实现,那么自然希望能够将那部分代码抽取出来, 在新程序中使用。

6.在结构化程序设计中,随着程序规模的增大,由 于程序大量函数、变量之间的关系错综复杂,要抽取这部分代码,会变得十分困难。

总之,结构化的程序,在规模庞大时,会变得难以理解,难以扩充(增加新功能),难以查错,难以重用。

  • 如何更高效地实现函数的复用?
  • 如何更清晰的实现变量和函数的关系?使得程序 更清晰更易于修改和维护。

面向对象的程序设计

面向对象的程序 = 类 + 类 + …+ 类

面向对象的程序设计方法:

将某类客观事物共同特点(属性)归纳出来,形成一个数据 结构(可以用多个变量描述事物的属性);

将这类事物所能进行的行为也归纳出来,形成一个个函数, 这些函数可以用来操作数据结构(这一步叫“抽象”)。

然后,通过某种语法形式,将数据结构和操作该数据结构的函 数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。

面向对象的程序设计具有“抽象”,“封装”“继承”“多态” 四个基本特点。

例如:

将长、宽变量和设置长,宽,求面积,以及求周长的三个函数“封装”在一起,就能形成一个“矩形类”。

长、宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数” 。 成员变量和成员函数统称为类的成员。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

classCRectangle

{

public:

intw, h;

intArea() {

returnw * h;

}

intPerimeter(){

return2 * ( w + h);

}

voidInit(intw_,inth_ ) {

w = w_; h = h_;

}

};// 必须有分号

通过类,可以定义变量。类定义出来的变量,也称为类的实例,就是我们所说的“对象” 。

C++中,类的名字就是用户自定义的类型的名字。可以象使用基本类型那样来使用它。CRectangle 就是一种用户自定义的类型。

1

2

3

4

5

6

7

8

9

10

intmain( )

{

intw,h;

CRectangle r;//r 是一个对象

cin >> w >> h;

r.Init( w,h);

cout << r.Area() << endl

<<r.Perimeter();

return0;

}

对象的内存分配

类的内存分配与结构体分配内存相同,类的成员函数所占内存不属于类。

每个对象各有自己的存储空间。一个对象的某个成员变量被改变了,不会影响到另一个对象。

和结构变量一样,对象之间可以用 “=”进行赋值,但是不能用 “==”,“!=”,“>”,“<”“>=”“<=”进行比较,除非这些运算符经过了“重载”(第四篇讲)。

使用类的成员变量和成员函数

用法1:对象名.成员名

1

2

3

CRectangle r1,r2;

r1.w = 5;

r2.Init(5,4);

用法2: 指针->成员名

1

2

3

4

5

CRectangle r1,r2;

CRectangle * p1 = & r1;

CRectangle * p2 = & r2;

p1->w = 5;

p2->Init(5,4);//Init作用在p2指向的对象上

用法3:引用名.成员名

1

2

3

4

CRectangle r2;

CRectangle & rr = r2;

rr.w = 5;

rr.Init(5,4);//rr 的值变了,r2 的值也变

二、类和对象基础 类成员的可访问范围

在类的定义中,用下列访问范围关键字来说明类成员

可被访问的范围:

private: 私有成员,只能在成员函数内访问
public : 公有成员,可以在任何地方访问
protected: 保护成员,后面再说,暂时理解和私有成员类似

以上三种关键字出现的次数和先后次序都没有限制。

代码如下(示例):

1

2

3

4

5

6

7

8

classclassName {

private:

私有属性和函数

public:

公有属性和函数

protected:

保护属性和函数

};

如过某个成员前面没有上述关键字,则缺省地被认为是私有成员。

1

2

3

4

5

6

7

8

classMan {

intnAge;// 私有成员

charszName[20];// 私有成员

public:

voidSetName(char* szName){

strcpy( Man::szName,szName);

}

};

在类的成员函数内部,能够访问:

  • 当前对象的全部属性、函数;
  • 同类其它对象的全部属性、函数。

在类的成员函数以外的地方,只能够访问该类对象的公有成员。

成员函数在类内声明,一般在类外实现(也可类内声明并实现),需要加上“类名::”。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

classCEmployee {

private:

charszName[30];// 名字

public:

intsalary;// 工资

voidsetName(char* name);

voidgetName(char* name);

voidaverageSalary(CEmployee e1,CEmployee e2);

};

voidCEmployee::setName(char* name) {

strcpy( szName, name);//ok

}

voidCEmployee::getName(char* name) {

strcpy( name,szName);//ok

}

voidCEmployee::averageSalary(CEmployee e1,CEmployee e2){

cout << e1.szName;//ok ,访问同类其他对象私有成员

salary = (e1.salary + e2.salary )/2;

}

intmain()

{

CEmployee e;

strcpy(e.szName,"Tom1234567889");// 编译错,不能访问私有成员

e.setName("Tom");// ok

e.salary = 5000;//ok

return0;

}

设置私有成员的机制,叫“隐藏”

  • “隐藏”的目的是强制对成员变量的访问一定要通过成员函数 进行,那么后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 11:13:01

Phyphox进阶指南:从‘管口校正’深度优化你的声速测量实验精度

Phyphox进阶指南&#xff1a;从‘管口校正’深度优化你的声速测量实验精度 在物理实验教学中&#xff0c;声速测量是一个经典的基础实验&#xff0c;但要将测量精度提升到实验室级别&#xff0c;则需要更深入的技术优化和误差控制。Phyphox作为一款强大的手机实验工具&#xf…

作者头像 李华
网站建设 2026/5/23 11:11:28

HS2-HF_Patch终极指南:如何快速获得完整汉化与去码体验

HS2-HF_Patch终极指南&#xff1a;如何快速获得完整汉化与去码体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是《Honey Select 2》游戏的全功…

作者头像 李华
网站建设 2026/5/23 11:06:25

AssetRipper Unity项目重建全流程实战指南

1. 这不是“破解工具”&#xff0c;而是一把Unity项目的手术刀AssetRipper这个名字&#xff0c;第一次出现在我视野里&#xff0c;是在2021年一个凌晨三点的Discord频道。当时团队正为一个已下架的Unity手游做兼容性适配——原开发组解散、源码丢失、仅剩一个APK和几份模糊的策…

作者头像 李华