3.面向对象-封装-类和对象
3.1 知识点
知识回顾:面向对象概念回顾
- 万物皆对象
- 用程序来抽象(形容)对象
- 用面向对象的思想来编程
什么是类
- 基本概念:
- 具有相同特征
- 具有相同行为
- 一类事物的抽象
- 类是对象的模板,可以通过类创建出对象
- 关键词:
class
类在哪里声明和定义
- 类一般在
.h
结尾的头文件中声明 - 在
.cpp
结尾的源文件中定义 - 对于小型类或者模板类,可以在头文件中直接完成声明和定义
- 因此,通常需要新建脚本文件
类声明的语法
与结构体的声明很类似,只不过在类声明中会多一些面向对象的新知识点
类声明实例
下面以 Person
类为例,演示声明方式:
#pragma once
#include <iostream>
using namespace std;
class Person
{
//访问修饰符(可选)
public:
//第一部分
//成员变量
int age;
bool sex;
string name;
//第二部分
//构造函数和析构函数(可选)
Person();
~Person();
//第三部分
//成员函数(方法)
void Eat();
void Run();
void Sleep();
//等等
};
什么是(类)对象
- 类的声明和对象(变量)声明是两个不同的概念
- 类的声明类似枚举和结构体的声明,相当于声明了一个新的自定义类型
- 对象是类创建出来的实例,相当于声明一个该类类型的变量
- 类创建对象的过程通常称为“实例化”(instantiation)
实例化对象基本语法
引用类头文件:
#include "XXX.h"
普通对象(栈上)
类名 变量名; 类名 变量名 = 构造函数名(...);
指针对象(堆上)
类名* 变量名 = new 构造函数名(...);
引用对象
类名& 变量名 = 想要引用的对象;
实例化对象示例
#include "Person.h"
// 栈上
Person person1;
Person person2 = Person();
// 堆上
Person* person3 = new Person();
delete person3;
person3 = nullptr;
// 引用
Person& person4 = person2; // 引用栈上对象
// Person& person5 = person3; // 引用已删除的堆上对象,会报错
总结
- 类和对象相关知识点与结构体几乎一致:都是自定义类型,包含数据和方法
- 类与结构体更像是对象的“模板”,用于描述一类对象
- 使用它们之前,需要先进行实例化,即创建对象
- 类的声明和定义可以分别放在
.h
和.cpp
中 - 在引用其它文件中声明和定义的类时,需要先
#include
对应的头文件,否则无法正常使用
3.2 知识点代码
Person.h
#pragma once
#include <iostream>
using namespace std;
class Person
{
//访问修饰符(可选)
public:
//第一部分
//成员变量
int age;
bool sex;
string name;
//第二部分
//构造函数和析构函数(可选)
Person();
~Person();
//第三部分
//成员函数(方法)
void Eat();
void Run();
void Sleep();
//等等
};
Lesson03_面向对象_封装_类和对象.cpp
#include <iostream>
#include "Person.h"
using namespace std;
int main()
{
#pragma region 知识回顾 面向对象概念回顾
//万物皆对象
//用程序来抽象(形容)对象
//用面向对象的思想来编程
#pragma endregion
#pragma region 知识点一 什么是类
//基本概念
// 具有相同特征
// 具有相同行为
// 一类事物的抽象
// 类是对象的模板
// 可以通过类创建出对象
//
// 类的关键词
// class
#pragma endregion
#pragma region 知识点二 类在哪里声明和定义
//类一般
// 在.h结尾的头文件中声明
// 在.cpp结尾的源文件中定义
// 对于小型类或者模板类,可以在头文件中直接完成声明和定义
// 因此我们一般需要新建脚本文件
#pragma endregion
#pragma region 知识点三 类声明的语法
//和结构体的声明很类似 只不过会多讲一些新的知识点
#pragma endregion
#pragma region 知识点四 类声明实例
// 比如声明Person类
#pragma endregion
#pragma region 知识点五 什么是(类)对象
//基本概念
// 类的声明 和 类对象(变量)声明是两个概念
// 类的声明 类似 枚举 和 结构体的声明 类的声明相当于声明了一个自定义变量类型
// 而对象 是类创建出来的
// 相当于声明一个指定类的变量
// 类创建对象的过程 一般称为实例化对象
#pragma endregion
#pragma region 知识点六 实例化对象基本语法
//步骤一:引用类头文件
//#include "XXX.h"
//步骤二:声明对象
//普通对象(栈上)
//类名 变量名;
//类名 变量名 = 构造函数名(...);
//指针对象(堆上)
//类名* 变量名 = new 构造函数名(...);
//引用对象(根据引用对象自己决定在栈还是堆)
//类名& 变量名 = 想要引用的对象;
#pragma endregion
#pragma region 知识点七 实例化对象
//最前面 #include "Person.h"
//栈上
Person person1;
Person person2 = Person();
//堆上
Person* person3 = new Person();
delete(person3);
person3 = nullptr;
//引用
Person& person4 = person2;//指向栈上
//Person& person5 = person3;//指向堆上 因为把person3删了所以这句会报错
#pragma endregion
}
//总结
//类和对象相关知识点
//和我们的结构体中的 结构体和对象 几乎一致
//类和结构体 都是我们自定义的变量类型 数据和方法的集合
//他们更像是 对象的模板 是形容(抽象)一类对象的代码
//如果要真正使用它们,我们需要进行实例化
//也就是创建对象
//需要注意的就是
//类的声明和定义可以在.h和.cpp中分开进行
//类的声明中多了一些新的知识点
//在使用别的文件中声明和定义的类时,需要先引用对应的头文件 否则无法正常使用类
3.3 练习题
将下面的食物进行分类,可重复
机器人、机器、人、猫、张阿姨、隔壁老王、汽车、飞机、向日葵、菊花、太阳、星星、荷花
机器类:机器人、机器、汽车、飞机
人类:人、张阿姨、隔壁老王
动物类:猫、人、张阿姨、隔壁老王
植物类:向日葵、菊花、荷花
星球类:太阳、星星
置空指针对象代码题
GameObject* A = new GameObject();
GameObject* B = A;
B = nullptr;
A目前等于多少?
A还是指向之前在堆上分配的空间中的对象
A存的是指向GameObject的地址
B=A 让B也存的是指向GameObject的地址
B = nullptr; 只会置空B执行的地址 而不会置空GameObject对象
重新赋值指针对象代码题
GameObject* A = new GameObject();
GameObject* B = A;
B = new GameObject();
A和B有什么关系?
没有任何关系 B指向新的对象 分别指向的是两个对象
3.4 练习题代码
GameObject.h
#pragma once
class GameObject
{
public:
int i;
};
Lesson03_练习题.cpp
#include <iostream>
#include "GameObject.h"
using namespace std;
int main()
{
#pragma region 练习题一
//将下面的实物进行分类,可重复
//机器人、机器、人、猫、张阿姨、隔壁老王、汽车、飞机、向日葵、菊花、太阳、星星、荷花
//机器类:机器人、机器、汽车、飞机
//人类:人、张阿姨、隔壁老王
//动物类:猫、人、张阿姨、隔壁老王
//植物类:向日葵、菊花、荷花
//星球类:太阳、星星
#pragma endregion
#pragma region 练习题二
GameObject* A = new GameObject();
GameObject* B = A;
B = nullptr;
cout << A->i;
// A目前等于多少?
// A还是指向之前在堆上分配的空间中的对象
// A存的是指向GameObject的地址
// B=A 让B也存的是指向GameObject的地址
// B = nullptr; 只会置空B执行的地址 而不会置空GameObject对象
delete(A);//正常需要手动释放
A = nullptr;
#pragma endregion
#pragma region 练习题三
GameObject* A = new GameObject();
GameObject* B = A;
B = new GameObject();
//A和B有什么关系?
// 没有任何关系 B指向新的对象 分别指向的是两个对象
delete(A);
A = nullptr;
delete(B);
B = nullptr;
#pragma endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com