c++面试题总结,C++基础面试题
第一篇前言。基础篇1.1面向对象的基本特性封装继承多态性几种特定表达式重写重载转换(子类到父类)2。进阶篇2.1指针2.2引用左值引用c 11特性:右值引用3,扩展4。基本点4.1 delete和free 1的异同4.1 delete会先调用析构函数再释放内存,free只会释放内存。4.2 new与malloc 1的异同。应用内存2的位置。返回类型安全3。内存分配失败时返回值4。需要指定内存大小5。调用构造函数/析构函数6。阵列7的处理。Can 7.new和malloc互称8。他们会超载吗?可以直观地重新分配内存10。客户处理内存分配不足4.3字段指针和内存泄漏字段指针内存泄漏内存泄漏场景4.3构造函数4.3.1构造函数可以是虚函数吗——否4.3.2构造函数/析构函数是否占用内存空间4.4静态链接和动态链接有什么区别?4.6普通复制深度复制和轻度复制构造函数复制赋值运算符重载4.7字节对齐字节对齐的基本原则五、要点5.1指针和引用的共同点和区别5.1.1共同点1 .指针和引用都可以用作形式参数来改变参数的值。5.1.2区别1。定义不同2。指针可以有多个级别,引用只能有一个级别3。指针可以定义时不初始化,引用必须定义时必须初始化4。指针可以指向NULL,引用不能为NULL 5。指针可以在初始化后改变。不能引用。6.sizeof的运算结果不一样。7.自增运算的意义不一样。8.当指针和引用被用作函数参数时,需要检查指针是否为空。参考5.2主函数之前不需要做什么。6.困难。6.1.1 RAII资源机制。6.1.2垃圾收集机制。7.工作建议。1.刚到新岗位的时候,多交流,不要无聊。2.尽快熟悉,对自己有明确的工作安排。八。感谢以下链接作者的帮助。前言感谢以上作者整理。以下内容都是结合自己的一些理解。
1.基础章节1.1面向对象的基本特征封装、继承和多态。
封装:就是隐藏对象的属性和实现细节,只对公众公开接口(方法),控制程序中读取和修改属性的访问级别(公共/保护/私有)。
目的:封装的目的是增强安全性和简化编程。用户不需要知道具体的实现细节,只需要通过外部接口使用具有特定访问权限的类成员即可。
继承是面向对象的基本特征之一,继承机制允许创建层次类。
定义:继承是指子类继承了父类的特征和行为,这样子类对象(实例)就拥有了父类的实例域和方法,或者子类继承了父类的方法,这样子类就拥有了与父类相同的行为。
注意:C支持多重继承(java只支持单一继承),可能会导致菱形继承。
多态性的定义:多态性:同一行为具有多种不同表现或形式的能力。意味着一个类实例(对象)的同一个方法在不同的情况下有不同的表现形式。
(主要体现在重写和重载)
几个具体的表达式在继承父类后重写子类,重新定义父类的方法。
重载改变现有方法的参数类型和数量。
上面的转换(子类到父类)指的是子类对象。
正确用法:
Parent * pParent=new Child孩子孩子;
Parent * p Parent=(Parent *)child;错误使用
Child* pChild=新父母;二、高级篇2.1指针定义:值是地址,指向内存。
2.2参考左值参考
定义:变量的别名,在初始化时定义。
左值引用实际上和汇编级的普通指针是一样的。
int a=10
int b=a;//定义一个左值引用变量
b=20//通过左值引用修改引用内存的值。c 11特点:右值引用C对于左值和右值没有标准的定义,但是有一个广为接受的说法:
可以取地址,名字,非临时是左值;不能带地址,没有名字,临时才是对的值;
不能带地址,没有名字,临时才是对的值。
Type name=右值表达式;
int var=10
右值引用的存在并不是为了取代左值引用,而是为了充分利用右值(尤其是临时对象)的构造来减少对象构造和销毁的操作,以达到提高效率的目的。
三、第四章的拓展,基本点4.1删除和释放的异同都是释放内存的同一点
要点1.delete会先调用析构函数然后释放内存,free只会释放内存。4.2 new和malloc的异同New和malloc的异同
异同1。应用内存的位置
新:为空闲存储上的对象动态分配内存空间,
Malloc:从堆中动态分配内存。
自由内存区:C基于new运算符的抽象概念。每当通过new运算符进行内存应用时,内存就是一个空闲的内存区域。
堆:操作系统中的一个术语,它是操作系统维护的一种特殊内存,用于动态分配程序的内存。c语言使用malloc从堆中分配内存,并释放所分配的相应内存。
空闲存储区是否是堆:这取决于new的实现。空闲存储区不仅可以是堆,也可以是静态存储区。这完全取决于操作符new为对象分配内存的位置。
2.返回型证券
返回指向标准类型new的指针。
Malloc返回void*
3.内存分配失败时返回值。
当新内存分配失败时,会抛出bac_alloc异常,不会返回NULL;分配内存失败时,Malloc返回NULL。
4.需要指定内存大小吗?
当使用new运算符申请内存分配时,没有必要指定内存块的大小。编译器会根据类型信息自行计算,而malloc需要显式指明所需内存的大小。
5.是否调用构造函数/析构函数。6.数组的处理。c提供了new[]和delete[]来专门处理数组类型:
A * ptr=new A[10];//分配10个A对象。用new[]分配的内存必须用delete[]释放:
删除[]ptr;
新数组的支持是它调用构造函数分别初始化每个数组元素,释放对象时为每个对象调用析构函数。注意delete[]要和new[]一起使用,否则会查出数组对象部分释放的现象,造成内存泄漏。
至于malloc,它不知道你要放在这个内存里的数组还是别的什么。反正它会给你一段原始内存,然后你就搞定了内存的地址。因此,如果我们想要动态分配数组的内存,我们还需要手动定制数组的大小:
int * ptr=(int *)malloc(sizeof(int));//分配10个int元素的数组。7.7.new和malloc可以互叫吗?8.它们会超载吗?9.他们能凭直觉重新分配记忆吗?10.客户需要处理内存分配不足的问题。4.3野指针和内存泄漏的定义野指针:指针指向未知内存,导致越界访问/非法访问等问题。
几种情况:
未初始化指针所指向的内存被释放后,指针不被设置。指针操作超出了变量的范围。内存泄漏的定义:堆内存(new/malloc)不释放,导致运行时内存增加,直到程序出现一定程度的崩溃。
内存泄漏场景malloc和free没有配对;New/new []和delete/delete []不能成对出现;
1在堆中创建一个对象来分配内存,但不显式释放内存;例如,locall
2在构造函数中动态分配内存,但在析构函数中不能正确释放内存;\未定义复制构造函数或未重载赋值运算符,导致两次释放同一个内存的做法;例如,一个类包含指针成员变量。如果没有定义复制构造函数或者没有重载赋值操作符,编译器会调用默认的复制构造函数或者赋值操作符来逐个复制指针成员变量,这样两个对象就包含了指向同一个内存空间的指针。当释放第一个对象时,析构函数释放指针所指向的内存空间,当释放第二个对象时,析构函数将释放相同的内存空间。这种行为是错误的。将没有基类的析构函数定义为虚函数。4.3构造函数4.3.1构造函数可以是虚函数吗——不可以
4.3.2构造函数/析构函数是否占用内存空间?
对象的大小是指它的数据成员在该类实例化的对象中所占用的内存大小,但不包括成员函数,所以不被占用。
4.4静态链接和动态链接有什么区别?
静态链接:编译链接时,将所需的执行代码直接复制到调用处;
优点:程序发布时不需要依赖库,可以独立执行。
缺点:程序的体积会比较大,如果更新静态库,所有可执行文件都需要重新链接;动态链接:它不是在编译时直接复制执行代码,而是记录一系列符号和参数,在程序运行或加载时将这些信息传输给操作系统。操作系统负责将所需的动态库加载到内存中,然后当程序运行到指定代码时,在共享执行内存中搜索加载的动态库可执行代码,实现运行时链接;
优点:多个程序可以共享同一个动态库,节省资源;
缺点:因为运行时加载,可能会影响程序的早期执行性能。
4.6普通拷贝深度拷贝和浅拷贝浅拷贝只拷贝指向一个对象的指针,而不拷贝对象本身。新旧对象仍然共享一个内存;深层复制将创建一个完全相同的对象。新对象不与原始对象共享内存,修改新对象不会影响原始对象。复制构造函数复制赋值运算符重载4.7字节对齐字节对齐基本原理结构体中长度最大的变量是一次性访问长度。
5.要点5.1指针和引用的共同点和区别5.1.1共同点1。指针和引用都可以用作形式参数来改变实际参数的值。举个例子
void函数(Object *pObj)
等于
void函数(对象对象)
5.1.2区别1。不同的定义
指针是一个存储地址的变量,指向内存中的存储位置。
它指的是原变量的别名,本质上和原变量是一回事。
2.指针可以有多级,引用只能有一级。
有趣的是,N级指针的效果等于n-1级指针。
例如:
void Func(Object * * * PP BoJ);
等于
void Func(Object * * PP robj);3.当一个指针可以被定义时,它不会被初始化;当一个引用必须被定义时,它将被初始化;4.指针可以指向NULL5.指针初始化后,可以更改;6.如果sizeof的计算结果不同,将返回指针的sizeof;
返回引用的原始类型大小。
int a=996
int * p=a;
int r=a;
cout sizeof(p);//返回int*类型的大小
cout sizeof(r);//返回int类型的大小。7.自动递增操作的含义是不同的。8.当指针和引用作为函数参数时,指针需要检查是否为空。参考5.2主函数之前不需要做什么。1.设置堆栈指针;
2.初始化静态和全局变量,即数据段的内容;
3.设置未初始化部分的初始值:numerical short,int,long等。均为0,bool为FALSE,指针为NULL;
4.传递主函数的参数,argc,argv等。在实际运行主函数之前。
比如Windows平台根据编码格式Unicode或者多字节确定XXXCRTStartup函数然后调用main。
参考我的windows核心编程主函数的生命周期。
不及物动词难度6.1内存管理6.1.1 RAII资源机制6.1.2 GC垃圾收集机制七。工作建议1。刚到新的岗位,多沟通,不要默默工作。2.尽快熟悉,对自己有明确的工作安排。八。感谢以下链接作者的帮助。面向对象的三个基本特征和五个基本原则。
指针和引用的区别
智虎帅迪c基地
智虎拓跋阿秀经常遇到问题。
动态内存分配和内存泄漏
新malloc和新Malloc的异同
二次元怪兽原创作品,博主,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。