从0开始C++(二):类、对象、封装

目录

类&对象的概念

类的内容

对象的创建

[● 栈内存对象](#● 栈内存对象)

[● 堆内存对象](#● 堆内存对象)

封装


类&对象的概念

类和对象是一个比较抽象的概念,这里直接用一个实例方便理解。

类:类是一个抽象的概念,用来描述同一类对象的特点(比如:颜色、尺寸、价格、速度)

对象:根据类的概念所创造的实体(比如: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; //可以使用预留的接口访问 
}
相关推荐
我是陈泽12 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
Mr.Z.41119 分钟前
【历年CSP-S复赛第一题】暴力解法与正解合集(2019-2022)
c++
优雅的小武先生22 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
Death20023 分钟前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
虽千万人 吾往矣28 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人31 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈34 分钟前
C++——list
开发语言·c++·list
杨荧35 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源
ZPC821041 分钟前
Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)
开发语言·python·matplotlib
镜花照无眠43 分钟前
Python爬虫使用实例-mdrama
开发语言·爬虫·python