目录
[● 栈内存对象](#● 栈内存对象)
[● 堆内存对象](#● 堆内存对象)
类&对象的概念
类和对象是一个比较抽象的概念,这里直接用一个实例方便理解。
类:类是一个抽象的概念,用来描述同一类对象的特点(比如:颜色、尺寸、价格、速度)
对象:根据类的概念所创造的实体(比如:xiaomi su7)
类的内容
类中最基础的内容包括两个部分,一个是属性,一个是行为。
● 属性:表示一些特征项的数值,比如说:颜色、型号、速度等等。而这些特征项的数值,也被称为"成员变量"。属性一般以名词存在。
● 行为:表示能执行的动作,能干什么事情?比如说:跑赛道、接入米家生态等。也被称为"成员函数"。行为一般以动词存在。
cpp
class Car
{
public: // 权限:最开放的权限
string brand; // 品牌
string modle; // 型号
int weight; // 重量
};
对象的创建
C++中存在两种类型的对象,栈内存对象和堆内存对象
● 栈内存对象
栈内存对象的生命周期与函数的生命周期相同。这些对象存储在栈内存中,一般称为局部对象。
当函数被调用时,会在栈内存上为函数的局部变量和对象分配内存空间。这些对象在函数执行期间可见且可用,一旦函数执行完毕,栈内存会被释放,这些对象也会随之被销毁。
对于栈内存对象,它们的创建和销毁是自动进行的,无需手动管理内存。这是由编译器自动完成的,称为栈上的自动变量。当函数被调用时,编译器会为每个局部变量和对象分配所需的内存空间,并在函数返回后释放这些内存空间。
优缺点:
栈内存对象的优点是速度快、创建和销毁方便。然而,栈内存是有限的,其大小通常受到限制。如果函数中创建的局部变量和对象过多或占用过多的内存空间,可能会导致栈溢出的问题。因此,对于较大的对象或需要长时间存在的对象,更适合使用堆内存来进行动态分配和管理。
创建方法:
类名 对象名;
cpp
class Car
{
public: // 权限:最开放的权限
string brand; // 品牌
string modle; // 型号
int weight; // 重量
};
int main()
{
Car myCar; // 创建栈内存对象
}
● 堆内存对象
堆内存对象是指在堆内存中动态分配的对象。与栈内存对象不同,堆内存对象的生命周期不受函数的调用和返回影响,它们可以在程序的任意位置创建和销毁。
堆内存对象的创建需要使用特定的函数,如C++中的
new
运算符或malloc
函数。这些函数在堆内存中分配一块指定大小的内存空间,并返回指向该内存空间的指针。通过指针,可以访问和操作堆内存对象。与栈内存对象不同,堆内存对象的销毁需要手动释放 。在使用完堆内存对象后,需要使用特定的函数,如C++中的
delete
运算符或free
函数,释放所占用的内存空间。如果不释放堆内存对象,就会造成内存泄漏,导致程序的内存消耗增加并可能导致程序崩溃。优缺点:
堆内存对象的优点是灵活性和可控性。由于动态分配,堆内存对象的大小可以在运行时确定,而不受编译时的限制。此外,堆内存对象的生命周期可以由程序员控制,可以创建和销毁多次,可以在不同作用域中访问。但需要注意的是,堆内存的分配和释放操作相对比较耗时,也容易产生内存泄漏或悬空指针等问题,因此需要谨慎使用和管理。
创建方法
类名 *指针名 = new 类名
销毁:
delete 指针名;
cpp
class Car
{
public: // 权限:最开放的权限
string brand; // 品牌
string modle; // 型号
int weight; // 重量
};
int main()
{
Car *myCar = new Car; // 创建堆内存对象
detele myCar; //释放空间
}
封装
在前面创建的普通类Car与结构体差别不大,实际上可以认为结构体就是一种完全开放的类。
封装指的是,将类的一些属性使用 private 进行私有化,并重新提供外部访问接口。私有化的成员只能在类内访问,封装可以提升代码的安全性,并且可以让程序员更关注上层架构而非内部细节。
cpp
class Car
{
private://权限:最私有的权限
string brand; // 品牌
string modle; // 型号
int weight; // 重量
public: // 权限:最开放的权限
string get_brand() //外部函数接口
{
return brand;
}
string get_modle()
{
return modle;
}
int get_weight()
{
return weight;
}
};
int main()
{
Car *myCar = new Car; // 创建堆内存对象
//cout << Car.brand << endl; //错误,brand是私有成员 不能外部访问
cont << Car.get_brand << endl; //可以使用预留的接口访问
}