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;}//型号的setvoid set_modle(string m){
modle=m;}//重量的setvoid 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;
}