C++ 面向对象基础-类与对象、封装

目录

1. 类与对象

1.1 概念

1.2 类的内容

1.3 类与对象的创建

1.4 思考:new 与malloc 的区别

2. 封装


1. 类与对象

1.1 概念

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

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

思考:

1.一个对象可以没有对应的类吗?

不可以,因为必须先有类再有对象,对象是类的实例化。

2.可以只有类没有对象吗?

可以,但是如果只写一个类俄日没有实例化的对象,这样的类是没有意义的。

1.2 类的内容

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

属性:表示一些特征项的数值,比如说:身高、体重、年龄、性别。型号、尺寸。而这些特征项的数值也被称为“成员变量”。属性一般以名词存在。

行为:表示能执行的动作,能干什么事?比如说:吃饭、睡觉、打架、玩游戏、学习、唱、跳、rap、打篮球。行为一般通过函数实现,也被称为“成员函数”。行为一般以动词存在。

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

关于class(类)的几点说明:

(1)类的定义的最后有一个分号,它是类的一部分,表示类定义结束,不能省略。

(2)一个类可以创建多个对象,每个对象都是一个变量

以手机为例,说明类的定义:

规定手机能播放音乐、运行游戏、打电话。手机有品牌、型号、重量三个属性。

规定手机能播放音乐、运行游戏、打电话。手机有品牌、型号、重量三个属性。
#include <iostream>

using namespace std;

// 帕斯卡命名法(大驼峰命名法)
// 每个单词的首字母要大写
class MobilePhone
{
public: // 权限:public 最开放的权限
    string brand;   // 品牌
    string model;   // 型号
    int weight;     // 重量

    void play_music()
    {
       cout << "只因你太美,哒哒哒" << endl;
    }

    void run_game()
    {
        cout << "原神启动、LOL、火影忍者、元气骑士、忍者必须死3、植物大战僵尸杂交版、只狼、王者荣耀、明日方舟、拳皇" << endl;
    }

    void call()
    {
        cout << "宝贝在吗" << endl;
    }

};

int main()
{

    return 0;
}

1.3 类与对象的创建

类的创建:

用 class 进行创建, class + 类名

public :最开放的权限

private :私有权限,最封闭的权限,只能在类内拷贝

 c++中存在的两种类型的对象:

● 栈内存对象:对象所在的{}执行完毕之后,自动被销毁。

● 堆内存对象

必须使用 new 关键字创建,使用指针保存,delete 关键字销毁,如果不销毁,则堆内存对象会持续存在。从而导致内存泄漏。堆内存调用对象是,使用的 -> 而不是 .

 栈内存对象与堆内存对象创建与使用的实力对比:

#include <iostream>

using namespace std;

class GenShin
{
public:
    string name;
    string sex;
    string from;
    string wuqi;
    string yuansu;

    void Ejineng()
    {
        cout << "坚如磐石" << endl;
    }

    void Qjineng()
    {
        cout << "天动万象" << endl;
    }

    void TianFu()
    {
        cout << "挖矿" << endl;
    }
};


int main()
{
    // 栈内存对象
    GenShin juese;
    juese.name = "烟绯";
    juese.sex = "女";
    juese.from  = "璃月";
    juese.wuqi = "法典";
    juese.yuansu = "火系";

    cout << juese.name << " " << juese.sex << " " << juese.from << " " <<
            juese.wuqi << " " << juese.yuansu << " " << endl;

    cout << endl;

    juese.Ejineng();
    juese.Qjineng();
    juese.TianFu();
    cout << endl;
    
//----------------------------------------------
    // 堆内存对象
    GenShin* laodeng = new GenShin;
    laodeng->name = "钟离";
    laodeng->sex = "男";
    laodeng->wuqi = "长枪";
    laodeng->from = "璃月";
    laodeng->yuansu = "岩系";

    cout << laodeng->name << " " << laodeng->sex << " " <<
            laodeng->from << " " << laodeng->wuqi << " " << laodeng->yuansu << endl;

    cout << endl;

    laodeng->Ejineng();
    laodeng->Qjineng();
    laodeng->TianFu();
    cout << endl;

    delete laodeng;   // 手动销毁
    laodeng = NULL;
    return 0;
}

 

1.4 思考:new 与malloc 的区别

面试题:new 和 delete 与 malloc 与 free 的区别?

(1)属性:new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。

(2)参数:使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

(3)返回值类型:new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回    void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

(4)分配失败时:new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

2. 封装

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

利用 private , 把属性与行为变为私有权限,提供一个外部函数接口进行访问。

 

封装实例:

将成员变量标为私有权限,这样成员变量在类外就不允许访问,只能通过提供的get函数来获取数据,提供set函数来修改变量数据。

#include <iostream>

using namespace std;

// 封装函数
class MoblePhone
{
private:  // 权限:私有权限,private最封闭的权限,只能在类内访问
    string bread;
    string model;
    int weight = 200;

public:   // 权限:最开放的权限
    // get函数
    string get_bread()
    {
        return bread;
    }
    // set函数
    void set_bread(string b)
    {
        bread = b;
    }

    string get_model()
    {
        return model;
    }

    void set_model(string c)
    {
        model = c;
    }

    int get_weight()
    {
        return weight;
    }
};


int main()
{

    //    封装:栈内存对象
    MoblePhone mp1;
    mp1.set_bread("小米手机");
    cout << mp1.get_bread() << endl;

    mp1.set_model("小爱同学");
    cout << mp1.get_model() << endl;
    cout << mp1.get_weight() << endl;
    cout << endl;

    //    封装:堆内存对象
    MoblePhone *mp2 = new MoblePhone;
    mp2->set_bread("红米手机");
    cout << mp2->get_bread() <<endl;

    mp2->set_model("干翻小米");
    cout << mp2->get_model() <<endl;

    return 0;
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值