[C++] 二 类、对象、封装

本文介绍了C++中的类与对象概念,强调了先有类后有对象的原则。类包含行为(成员函数)和属性(成员变量),并以手机为例展示了如何定义和使用类。对象可以存在于栈内存或堆内存中,前者自动销毁,后者需手动管理。文章还讨论了封装的重要性,以及通过getter和setter方法实现的访问控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类与对象:

类:一种抽象的概念,其内部是对某些行为和属性的总结

对象:根据类这个概念创造出来的实体,一个对象必然有一个类

需要注意的是,一定是先有类,再创建出这个类的对象;在学习static关键字之前,如果只有类没有 这个类的对象,这样的类没有意义

类的内容:类分为行为(成员函数)和属性(成员变量、数据成员)

类的内容主要通过行为和属性组成,行为是能做的事,通常使用函数来表示,也就是成员函数;

属性是存储的数据,通常称为成员变量

成员函数与成员变量统称为成员变量

//以手机为例:
class MobilePhone
{
public:   //公有权限:没有任何访问限制
    string brand; //品牌(属性)
    string model; //型号(属性)
    int weiget;   //重量(属性)
    
    void communicate() //通信(行为)
    {
        cout << "可以通信" << endl;
    }
    
    void run_game() //运行游戏(行为)
    {
        cout << "总有地上的生灵敢于直面雷霆的威光" << endl;
    }
    
    void play_music() //播放音乐(行为)
    {
        cout << "只因你太美" << endl;
    }
};

实例化对象

对象的创建也被称为实例化,一个类只有创建了对象之后才有实体。

对象在C++中有两类:

1、栈内存对象

创建不使用任何关键字,在其生命周期(所在的{})结束后,自动被销毁

2、堆内存对象

创建使用new关键字,销毁使用delete关键字,不会自动销毁。堆内存对象使用指针进行保存

//接上面代码:
int main()
{
    //栈内存对象
    MobilePhone mp1; 
    //调用属性
    mp1.brand = "8848钛金手机"; 
    mp1.model = "A99 PULS MAX";
    mp1.weiget = 150;
    cout << mp1.brand << " " << mp1.model
         << " " << mp1.weiget << endl;
    
    //调用成员函数
    mp1.communicate();
    mp1.play_music();
    mp1.run_game();
    //堆内存对象
    MobilePhone* mp2 = new MobilePhone;
    mp2->brand = "菠萝手机";
    mp2->model = "fandX800";
    mp2->run_game = 50;
    cout << mp2->brand << " " << mp2->model
         << " " << mp2->weiget << endl;
    
    mp2->communicate();
    mp2->play_music();
    mp2->run_game()
    
    //手动销毁,销毁之后不要再使用
    delete mp2;
    mp2 = NULL;
    
    cout << "主函数结束" << endl;
    return 0;
}

delete之后的对象不要再使用,也不要使用delete关键字修饰栈内存对象。

堆内存对象如果忘记delete会造成内存无法释放,这种现象称为“内存泄漏”

封装

前面写的类特别像一个结构体,那是因为一个完全开放的类就是结构体。

class和struct的区别:class默认权限是私有属性,struct默认权限是公有属性

这样的类所有细节都暴露在外面,不符合面向对象的特性

面向对象的三大特性:封装、继承、多态

封装是指将一些属性和其他细节隐藏,重新提供给外部调用的接口。类似于测试中黑白盒子的概念

封装的三种权限:public:公共权限、private:私有权限、protected:保护权限

公共权限:所有成员都可访问

私有权限:在这个类的类内能访问但是在类外不能访问,如果我们要访问被设置为私有权限的属性,只能在public中设置一个成员函数去访问被设置为私有权限的属性,这个函数就是对外的接口

保护权限:和私权限很相似,但保护权限的子类是能访问protected的属性和行为,但私有权限的子类不能

提供给外部访问的隐藏属性的接口通常分为两种:

setter:用于写入属性值

getter:用于读取属性值

通过这两类公开接口对属性的读写权限分离控制

class MobilePhone
{
private:
    string brand = "山寨";
    string model = "8848";
    int weight = 666;

public:
    string get_brand() // 只读
    {
        return brand;
    }

    void set_weight(int w) // 只写
    {
        weight = w;
    }

    string get_model() // 可读
    {
        return model;
    }

    void set_model(string m) // 可写
    {
        model = m;
    }

    void show()
    {
        cout << brand << endl;
        cout << model << endl;
        cout << weight << endl;
    }
};

int main()
{
    MobilePhone mp1;
    mp1.show();
    mp1.set_model("14");
    mp1.set_weight(233);
    cout << mp1.get_brand() << " " << mp1.get_model() << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值