类与对象:
类:一种抽象的概念,其内部是对某些行为和属性的总结
对象:根据类这个概念创造出来的实体,一个对象必然有一个类
需要注意的是,一定是先有类,再创建出这个类的对象;在学习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;
}