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
 
            