面向对象基础-类与对象-封装

发布时间:2023年12月31日

1、类与对象

1.1?概念

类:类是一个抽象的概念,用于描述一类对象的特点。

对象:根据类的概念所创造的实体。

【思考】一个对象可以没有对应的类嘛?

不可以,因为必须现有类才能创建对象。

1.2?类的内容

类中最基础的内容包括两部分,一个是属性、一个是行为。

  • 属性:表示一些特征项的数值,比如说:身高、体重、年龄、性别。型号、配色。这些特征项的数值被称为“成员变量”。属性一般以名词存在。
  • 行为:表示能执行的动作,能干什么事?比如说:睡觉、吃饭、打呼噜、打架、唱、跳、rap、打篮球。行为一般是通过?“成员函数”?实现。行为一般以动词存在。

成员?=?成员函数+成员变量。

【例子】以手机为例,来说明类的定义。

规定手机的行为:打游戏、爆炸、飞、打电话、播放音乐。

规定手机的属性:品牌、型号、重量、尺寸。

#include?<iostream>

using namespace std;

//?帕斯卡命名法(大驼峰命名法)
//?每个单词首字母大写
class MobilePhone
{
public: //?权限:public是最开放的权限。
//成员变量
    string?brand;   //?品牌
    string?modle;   //?型号
    int?weight;     //?重量
//成员函数
    void play_music()
    {
????????cout?<< "只因你太美,哒哒哒" <<?endl;
    }

    void run_game()
    {
????????cout?<< "原神启动" <<?endl;
    }

    void call()
    {
????????cout?<< "上帝您好" <<?endl;
    }
};

int main()
{
    return 0;
}

1.3?对象的创建

C++中存在两种类型的对象;(栈内存对象、堆内存对象)

  • 栈内存对象?(类似?struct?结构体创建)

对象所在的{}执行完毕后,自动被销毁

#include?<iostream>
using namespace std;
//?帕斯卡命名法(大驼峰命名法)
//?每个单词首字母大写
class MobilePhone
{
public: //?权限:public是最开放的权限。
    //?成员变量
    string?brand;   //?品牌
    string?modle;   //?型号
    int?weight;     //?重量
    //?成员函数
    void play_music()
    {
????????cout?<< "只因你太美,哒哒哒" <<?endl;
    }
    void run_game()
    {
????????cout?<< "原神启动" <<?endl;
    }
    void call()
    {
????????cout?<< "上帝您好" <<?endl;
    }
};
int main()
{
    MobilePhone?mp;     //?栈内存对象
????mp.brand?= "华为";
????mp.modle?= "mate?60?xspro";
????mp.weight?= 400;
????cout?<<?mp.brand?<< "?" <<
????????????mp.modle?<< "?" <<
????????????mp.weight<< "?" <<?endl;
????mp.play_music();
????mp.run_game();
????mp.call();
    return 0;
}

  • 堆内存对象?new?创建?(类似malloc)delete?销毁堆空间(类似free)

必须使用new关键字创建,使用指针保存(当前对象的首地址,调用构造函数)。

如果不使用delete关键字销毁,则内存对象会持续存在。导致内存泄漏。

堆内存对象调用成员时,使用->而不是"."(英文“.”自动生成“->”)

#include?<iostream>
using namespace std;
//?手机类
//?帕斯卡命名法(大驼峰)
class MobilePhone
{
public:     //?权限:最开放的权限
    string?brand;   //?品牌
    string?modle;   //?型号
    int?weight;     //?重量
    void play_music()
    {
????????cout?<< "只因你太美,哒哒哒" <<?endl;
    }
    void run_game()
    {
????????cout?<< "元神?启动" <<?endl;
    }
    void call()
    {
????????cout?<< "上帝你好" <<?endl;
    }
};
int main()
{
????MobilePhone?*mp?= new?MobilePhone; //?创建堆内存对象
????mp->brand?= "华为";
????mp->modle?= "mate?60?pro?plus";
????mp->weight?= 300;
????cout?<<?mp->brand?<< "?" <<?mp->modle?<< "?" <<?mp->weight?<<?endl;
????mp->play_music();
????mp->run_game();
????mp->call();
    delete?mp; //?手动销毁
????mp?=?NULL;//建议置为空,防止后面调用
    return 0;
}

2、封装

在上一节中MobilPhone类与结构体差别不大,实际上可以认为结构体就是一种完全开放的类。

封装指的是,将类的一些属性和细节隐藏。重新提供对外访问的接口。封装可以提升代码的安全性。并且可以让程序员更关注上层架构而非内部逻辑。

private:私有权限,最封闭的权限,只能在类内访问
public:权限:public是最开放的权限。

#include?<iostream>
using namespace std;
//?帕斯卡命名法(大驼峰命名法)
//?每个单词首字母大写
class MobilePhone
{
private: //?私有权限,最封闭的权限,只能在类内访问
    string?brand;   //?品牌
    string?modle;   //?型号
    int?weight;     //?重量

public: //?权限:public是最开放的权限。
    //?品牌的get函数
    string get_brand()
    {
        return?brand;
    }
    //?型号的get函数
    string get_modle()
    {
        return?modle;
    }
    //?重量的get函数
    int get_weight()
    {
        return?weight;
    }
    //?品牌的set函数
    void set_brand(string?b)
    {
????????brand?=?b;
    }
    //型号的set
    void set_modle(string?m)
    {
????????modle=m;
    }
    //重量的set
    void set_weight(int?w)
    {
????????weight=w;
    }
};
int main()
{
    //?栈内存对象
    MobilePhone?mp1;
????mp1.set_brand("中兴");
????mp1.set_modle("utrl");
????mp1.set_weight(444);
????cout?<<?mp1.get_brand() << "?"<<
????????????mp1.get_modle() << "?"<<
????????????mp1.get_weight() <<?endl;
    //堆内存对象
????MobilePhone?*mp2=new?MobilePhone;
????mp2->set_brand("华为");
????mp2->set_modle("mate60");
????mp2->set_weight(9000);
????cout?<<?mp2->get_brand() << "?"<<
????????????mp2->get_modle() << "?"<<
????????????mp2->get_weight() <<?endl;
    return 0;
}


文章来源:https://blog.csdn.net/m0_74937538/article/details/135315836
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。