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

c++ 类和对象总结

话不多说,我们直接进入主题:
对象:客观世界里的一切事物都可以看作是一个对象,每一个对象应当具有属性(静态特征,比如一个班级,一个专业,一个教室)和行为(动态特征,例如:学习,开会,体育比赛等)两个要素。 对象是由一组属性和一组行为构成的。
类(class):就是对象的类型,代表了某一批对象的共同特性和特征。类是对象的抽象,而对象是类的具体实例。

2.1 类的引入

在C语言中我们定义一个结构体是这样定义的:

1

2

3

4

5

6

7

8

9

10

11

structStudent

{

int_age;

char* _Gender;

char* _Name;

};

intmain()

{

structS;

return0;

}

我们都知道,在C中,“数据”和“处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性。那么,如果我们要在某种特定情况下让数据和函数有一定的关联,这个时候我们应该怎么处理呢?
先看一个例子:

很明显,编译器报错了,还很多。也就是说在C语言当中是不允许在结构体中定义函数的,那么在C++中是不是也是这样呢?

通过对比,我们明显的发现C++是可以做到我们想要将数据和函数产生一定关系的操作的。
为了区别C语言中结构体的定义struct,在C++中我们常用class来代替struct。

2.2 类的定义

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include <iostream>

usingnamespacestd;

classStudent

{

public:

char* _name;

private:

char* _Gender;

int_age;

};

intmain()

{

classS;

return0;

}

class是C++中定义类的关键字,Student为类的名字,{}中为类的主体,和结构体类似,在{}后面跟的是;。类中的元素称为类的成员,类中的数据称为类的属性或者类的成员变量,类中的函数称为类的成员函数。

类的定义通常有两种方式:

1、将类的声明和定义都放在类体中za
2、将类的声明放在.h头文件中,定义放在.cpp文件中

在代码中我们看到了private 和 public两个没有见过的东西,接下来我们讲一讲C++的三大特性:继承 封装 多态
封装:隐藏对象的属性和现实细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法有机结合。

这里的public 和 private是C++中的访问限定符,访问限定符有三个:public (公有) protected(保护) private(私有)。在下面的博文中我们会用到这些限定符,具体情况后续文章再作介绍,这里读者只需了解就可。

这里做一些说明:

1、public成员在类外可以直接访问
2、protected和private成员在类外不能够直接访问,在这里我们简单的把他们看成一样的。(二者区别就是基类private成员在派生类中是不能被访问的,如果基类成员不想再类外被访问,但需要在派生类中能访问,就定义为protected,后面博文更到派生类时我们会再来把这两个东西拿出来再讲一讲)
3、他们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现截止
4、class的默认访问权限是private,而struct默认访问权限是public(因为struct要兼容C的特点)

那么我们如何在类外访问一个类中的私有成员变量呢?(面试题)

方法一:在类中添加一个共有的方法

我们可以看到在public中定义的公有函数可以在类外访问私有成员变量,这是访问的一种方法。

类的作用域

在C语言阶段我们知道变量的作用域只有局部域和全局域两种,而在C++作用域则分为了局部域、全局域、命名空间域和类域四种,前面几种域相信我们都已将熟悉过,这里我讲一下类域。

类定义了一个新的作用域,类的所有成员都必须处在类的作用域中。形参表和函数体处于类的作用域中。在类体外定义成员,需要用 :: 作用域解析符指明成员属于哪一个类域。在类的作用域外,只能通过对象(或指针)借助成员访问操作符 . 和->来访问类成员,跟在访问操作符后面的名字必须在相关联的类的作用域中。

下面我们看看在代码中如何实现上述的意思:

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

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

usingnamespacestd;

namespaceN1//命名空间域

{

inta = 10;

}

inta = 20;//全局域

voidFunTest()

{

cout <<"FunTest()"<< endl;

}

classTest

{

public:

voidSetA(inta)

{

a = a;//存在歧义,是变量给变量赋值呢还是形参给变量赋值,或者变量给形参赋值呢?同学们不要这样写

//实际证明,这里的赋值是形参给形参赋值,结果并没有改变变量的值,结果出了函数作用域自然是一个随机值 正确写法: **_a = a;**

}

voidPrintA()

{

cout << a << endl;//cout << _a <<endl;

}

private:

inta;//类域 正确写法:int _a;

};

intmain()

{

inta = 40;//局部域

Test t;

t.SetA(30);

cout << N1::a << endl;//打印命名空间域的值

cout << ::a << endl;//打印全局域的值

cout << a << endl;//打印局部域的值

t.PrintA();//打印类域的值

return0;

}

看完这串代码不知道各位有没有什么疑惑呢?
这里附上这段代码的结果:

我们本应该想让编译器给我们打印出10 20 30 40这几个值,结果最后却给了我们一个乱码,这是为什么呢?
细心的同学应该发现了,在这里我们定义的所有的变量都是用的同一个名称a,这样的编码习惯是极不好的,容易引起误会,上面就给了一个反例。

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

相关文章:

  • 2026高温压力变送器行业格局:TOP10品牌是哪些 - 仪表人叶工
  • 别再乱用vector的insert和erase了!C++ STL迭代器失效的坑,我帮你踩完了(附VS2022调试实录)
  • PyOneDark Qt界面开发终极指南:5步打造现代化桌面应用
  • 佛山成品家具工厂哪家靠谱,2026采购避坑与实力工厂推荐 - 企业推荐师
  • 手把手教你学Simulink——基于Simulink的虚拟同步发电机(VSG)惯量支撑控制
  • 云浮地区债务法律服务机构排行:合规与实效双维度 - 奔跑123
  • 终极Sketchfab Blender插件指南:3步完成模型上传与下载
  • LEGION Y7000系列BIOS解锁终极指南:一键访问隐藏高级设置
  • 国内高温压力变送器十大品牌实测版 - 仪表人叶工
  • 3个理由告诉你为什么Intel Mac用户需要Turbo Boost Switcher
  • vue:pinia
  • 点云处理新思路:手把手拆解Point Transformer V2的‘分区池化’如何搞定不规则数据
  • 如何在macOS Finder中实现高效视频预览:QLVideo完整指南
  • 网盘直链智能解析:技术突破开启下载效率革命
  • 2026年粘钢加固公司最新推荐/房屋加固,基础加固,注浆加固,楼房加固,碳纤维布加固 - 品牌策略师
  • 《AI大模型应用开发实战从入门到精通共60篇》026、模型量化技术:GPTQ、AWQ与GGUF对比与实战
  • HBuilderX插件开发避坑指南:从package.json配置到发布上架的全流程实战
  • 避坑指南:EMX Modelgen 2.2破解后,如何在Virtuoso中成功调用并验证?
  • 2026年宜昌企业数字化获客完全指南:短视频全案+GEO本地精准推广实战方案 - 企业名录优选推荐
  • BiliTools跨平台哔哩哔哩工具箱部署指南:构建高性能视频解析与AI总结系统
  • 2026年客服对话机器人教程,快速搭建文本自动回复会话能力 - 品牌2026
  • 3步搞定城通网盘高速下载:免费直连提取工具终极指南
  • League Akari终极指南:如何用智能工具提升英雄联盟游戏体验
  • 2026年全国沥青筑路设备采购指南:德州源头厂家深度评测与方案对标 - 企业名录优选推荐
  • 告别HAL_Delay:在STM32中断服务函数中实现精准延时的三种替代方案(附代码)
  • 2026年如何安装Hermes/OpenClaw?阿里云搭建及token Plan配置攻略
  • 从零开始:5步完成黑苹果配置的OpCore-Simplify完全指南
  • 从MATLAB到C++实战:手把手教你移植Savitzky-Golay滤波器(含Eigen库边缘处理避坑指南)
  • 从零到生产:手把手教你用FortiGate VM搭建企业级虚拟化安全实验室
  • Vercel静态站被墙别慌!手把手教你用Cloudflare免费CDN+域名解析搞定DNS污染