C++语言基础问题与知识

本文介绍了C++的内存管理,包括栈、堆、全局/静态存储区等六个区域的特点,以及堆和栈的区别。同时,文章讨论了C++中的常用设计模式,如单例、适配器、工厂模式等,并解释了C++的多态性和引用特性。最后,给出了二维数组求行列数的方法以及常量字符串的内存表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三部分 语言基础
一、 C++内存管理
答:C++内存管理让C++拥有超绝的性能,java的内存管理是自动的,这也是java性能不如C++的原因。
在C++中,内存管理分为这个6大区:栈、堆、自由存储区、全局/静态存储区、常量存储区、代码区。
栈(Stack):局部变量,函数参数等存储在该区,又编译器自动分配和释放。栈属于计算机系统的数据结构,进栈和出栈有相应的计算机指令支持,而且分配专门的寄存器存储栈的地址,效率高,内存空间是连续的,单栈的内存空间有限。
堆(Heap):程序员手动分配(new)和释放(delete),属于动态分配方式。内存空间几乎没有限制,内存空间不连续,因此会产生内存碎片。如果程序员没有释放掉,那么在程序结束时,操作系统会自动回收。
全局/静态储存区:全局变量、静态变量分配到该区,到程序结束时自动释放。
常用存储区:存放常量(包括字符串等)
代码区:存放函数二进制代码
二、堆、栈区别?
对比项目 堆 栈
空间大小 空间不连续,没有限制,32位系统下,内存空间大小4G 空间连续,栈顶地址和最大空间确定
管理方式 编译器自动分配和释放 手动分配(new)和释放(delete)
生长方向 向内存地址增大的方向 想内存地址减小的方向
碎片问题 会产生大量空间碎片 先进后出的方式不会产生零碎空间
分配效率 低 高
三、C++常用设计模式
答1、单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁的创建和销毁。
何时使用:想要控制数目,节省系统资源的时候。
如何解决:判断系统是否已存在单例,如果有就返回,没有就创建。
单例大约有两种实现方法:懒汉与饿汉
懒汉:第一次用到类实例的时候才会去实例
饿汉:单例类定义的时候就会进行实例化
特点与选择:
线程同步,访问量比较大或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。空间换时间,在访问量较小,采用懒汉实现,以时间换空间。
2、适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。
主要解决:在系统软件中,常常要将一些“现存的对象”放到新的环境中。
何时使用:
(1)系统需要使用现有的类,而此类的接口不符合系统的需要。
(2)想要建立一个可以重复使用的类,用于与一些彼此没有太太关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
(3)通过接口转换,将一个类插入另一个类中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
如何解决:继承或依赖。
关键代码:适配器继承或依赖已有对象,实现想要的目标接口。
3、工厂模式:简单工厂模式,工厂方法模式,抽象工厂模式
(1)简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。
(2)工厂方法模式:是指定义一个创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
(3)抽象工厂模式:提供一个创建一系列相关或者互相依赖的接口而无需指定他们的类。
4、组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象和使用具有一致性。
主要解决:它在我们数型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
如何解决:树枝和树枝实现统一接口,树枝内部组合该接口。
关键代码:树枝内部组合该接口,并且含有内部属性list,里面放Component。
5、策略模式:是指定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。使得算法可以独立于使用它的客户而变化,也就是说这些算法所完成的功能是一样的,对外接口是一样的,只是各自现实上存在差异。
四、C++多态性与虚函数?
答:多态:一个接口,多种方法。
C++多态的概念是指不同函数功能的函数可以使用同一个函数名,这样就可以用一个函数名条用不同内容的函数。例如使用运算符“+”时,就是发送一个消息,他调用operator+函数。实际上整形、单精度型、双精度型的加法操作过程是互不相同的,是由不同函数实现的。
静态多态:也称为编译期间的多态,编译器在编译期间完成。
动态多态:运行时的多态,在程序执行期间判断所引用的对象的实际类型根据实际类型条用相应的方法。
五、C++特点?
答:封装、继承、多态
六、C++引用?
答:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称 或变量名称来指向变量。C++支持吧引用作为参数传给函数,这比传一般的参数更安全。
七、二维数组在不知道行数、列数的时候,怎么求?
答:array.size(); 行数
array[0].size(); 列数
八、(1)char str1[]=”hello world” (2)char str2[]=”hello world”
(3)charstr3=”hello world” (4)charstr4=”hello world”
答:C/C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存区域。(1)和(2)不相等,(3)和(4)相等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值