目录
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;
}