3.类和对象

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)

实例化对象基本语法

  1. 引用类头文件:

    #include "XXX.h"
    
  2. 普通对象(栈上)

    类名 变量名;
    类名 变量名 = 构造函数名(...);
    
  3. 指针对象(堆上)

    类名* 变量名 = new 构造函数名(...);
    
  4. 引用对象

    类名& 变量名 = 想要引用的对象;
    

实例化对象示例

#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

×

喜欢就点赞,疼爱就打赏