【C++】-- 类和对象(一)

简介: 【C++】-- 类和对象

语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。


一、类的定义

C语言中,结构体中只能定义变量,在C++中,类是一个类型,由两部分构成:

(1)成员变量(属性)

(2)成员函数(行为)(被当做内联函数处理)

C++中的struct兼容C的所有用法,同时C++中把struct升级成类。

Stack.cpp

1. #include <stdlib.h>
2. #include <iostream>
3. using namespace std;
4. 
5. 
6. typedef int STDataType;
7. 
8. struct Stack
9. {
10.   //初始化
11.   void StackInit(int initSize = 4)
12.   {
13.     a = (STDataType*)malloc(sizeof(STDataType) * 4);
14.     size = 0;
15.     capacity = initSize;
16.   }
17. 
18.   STDataType* a;
19.   int size;
20.   int capacity;
21. 
22. };
23. 
24. int main()
25. {
26. 
27.   Stack st;
28.   //struct Stack st; C++兼容c的语法,对struct进行了升级,也可以加struct关键字定义对象
29.   st.StackInit();
30. 
31.     return 0;
32. }

C++中的类用class关键字表示,类有两种定义方式:

(1)声明和定义全部放在类体中,成员变量位置放在类中前面或后面都可以,如下所示,全部放在cpp文件中。

1. #include <stdlib.h>
2. #include <iostream>
3. using namespace std;
4. 
5. typedef int STDataType;
6. 
7. class Stack
8. {
9. public:
10.   //初始化
11.   void StackInit(int initSize = 4)
12.   {
13.     a = (STDataType*)malloc(sizeof(STDataType) * 4);
14.     size = 0;
15.     capacity = initSize;
16.   }
17. 
18. public:
19.   STDataType* a;
20.   int size;
21.   int capacity;
22. 
23. };
24. 
25. int main()
26. {
27. 
28.   Stack st; //定义一个对象
29.   //struct Stack st; C++兼容c的语法,对struct进行了升级,也可以加struct关键字定义对象
30.   st.StackInit();
31. 
32.     return 0;
33. }

(2)类的声明放在.h文件中,类的定义放在.cpp文件中

Stack.h

1. #pragma once
2. #include <stdlib.h>
3. #include <iostream>
4. using namespace std;
5. 
6. typedef int STDataType;
7. 
8. class Stack
9. {
10. public:
11.   //初始化
12.   void StackInit(int initSize = 4);
13. 
14. public:
15.   STDataType* a;
16.   int size;
17.   int capacity;
18. 
19. };

Stack.cpp

1. #include "Stack.h"
2. 
3. void Stack::StackInit(int initSize = 4)
4. {
5.  a = (STDataType*)malloc(sizeof(STDataType) * 4);
6.  size = 0;
7.  capacity = initSize;
8. }
9. 
10. int main()
11. {
12. 
13.   Stack st;
14.   st.StackInit();
15. 
16.     return 0;
17. }

一般情况下,更期望采用第二种方式。

C++中struct和class的区别:

C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class的成员默认访问方式是private。

因此将struct改成class后,需要给成员变量和成员函数加上public访问限定符。


二、类的访问限定符和封装

1.类的访问限定符

用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将类的接口提供给外部用户使用。 C++的访问限定符分为以下几种:

(1)public修饰的成员在类外可以直接被访问

(2)protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

(3)访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

(4)class的默认访问权限为private,struct为public(因为struct要兼容C)

注意: 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。

2.类的封装

面向对象有3大特性:封装、集成、多态。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理:比如管理兵马俑,可以建一座房子把兵马俑给封装起来,不让别人看,开放售票通道,可以买票突破封装在合理的监管机制下进去参观。类也一样,使用类数据和方法都封装起来。不想给别人看的,使用protected/private把成员封装起来。开放一些公有的成员函数对成员合理的访问。所以封装本质是一种管理。

封装使面向对象更严格、更规范。


三、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。整个域是一个整体,成员变量无论在成员函数上面或者下面都可以进行访问。

1. #include<stdlib.h>
2. #include<iostream>
3. using namespace std;
4. typedef int STDataType;
5. 
6. class Stack
7. {
8. public:
9.  //初始化
10.   void StackInit(int initSize);
11. 
12. public:
13.   STDataType* a;
14.   int size;
15.   int capacity;
16. 
17. };
18. 
19. //指明成员属于Stack类
20. void Stack::StackInit(int initSize = 4)
21. {
22.     a = (STDataType*)malloc(sizeof(STDataType) * 4);
23.     size = 0;
24.     capacity = initSize;
25. }


四、类的实例化

类的实例化:用类型创建对象的过程。

为什么类要进行实例化?

(1)类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。

(2)一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。

(3) 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

1. #include <stdlib.h>
2. #include<iostream>
3. using namespace std;
4. 
5. typedef int STDataType;
6. 
7. struct Stack
8. {
9.  //初始化
10.   void StackInit(int initSize = 4)
11.   {
12.     a = (STDataType*)malloc(sizeof(STDataType) * 4);
13.     size = 0;
14.     capacity = initSize;
15.   }
16. 
17.   STDataType* a;
18.   int size;
19.   int capacity;
20. 
21. };
22. 
23. int main()
24. {
25. 
26.   Stack st; //实例化对象
27. 
28.     return 0;
29. }


相关文章
|
1月前
|
编译器 C++
C++之类与对象(完结撒花篇)(上)
C++之类与对象(完结撒花篇)(上)
34 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
26 4
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
16 0
|
1月前
|
编译器 C++ 数据库管理
C++之类与对象(完结撒花篇)(下)
C++之类与对象(完结撒花篇)(下)
29 0
|
1月前
|
编译器 C++
C++之类与对象(3)(下)
C++之类与对象(3)(下)
32 0
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)