从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; //可以使用预留的接口访问 
}
相关推荐
苏十八1 小时前
JavaEE Servlet01
java·开发语言·网络·servlet·java-ee·json·idea
白白白白纸呀2 小时前
WPF框架---MvvmLight介绍
开发语言·c#·wpf
float_六七2 小时前
二叉树三种遍历方式——前序、中序、后序(C++)
开发语言·c++·算法
suxiaoling@6 小时前
C# 使用GDI+设计登录窗体(窗体渐变和关闭淡出)
开发语言·c#
邦之彦7 小时前
C++:四大强制类型转换
开发语言·c++·static_cast·const_cast·dynamic_cast·reinterpretcast
陆鳐LuLu8 小时前
初学者如何用 Python 写第一个爬虫?
开发语言·爬虫·python
柿柿快乐8 小时前
C++入门基础
开发语言·c++
chuhx8 小时前
java 查找两个集合的交集部分数据
java·开发语言
AKAGSBGM8 小时前
PHP动态网站建设
开发语言·php
落落落sss9 小时前
分布式日志和责任链路
java·运维·开发语言·后端·jenkins