学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

132

积分

0

好友

16

主题
发表于 2 小时前 | 查看: 4| 回复: 0
来自:Cpp编程小茶馆

链接:https://blog.csdn.net/xu_fu_yong/article/details/122948379



1、C和C++的区别


1)C是面向过程的语言,是一个结构化的语言,考虑如何通过一个过程对输入进行处理得到输出;C++是面向对象的语言,主要特征是“封装、继承和多态”。封装隐藏了实现细节,使得代码模块化;派生类可以继承父类的数据和方法,扩展了已经存在的模块,实现了代码重用;多态则是“一个接口,多种实现”,通过派生类重写父类的虚函数,实现了接口的重用。


2)C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete关键字。


3)C++中有引用,C中不存在引用的概念

2、C++中指针和引用的区别


1)指针是一个新的变量,存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;


引用只是一个别名,还是变量本身,对引用的任何操作就是对变量本身进行操作,以达到修改变量的目的


2)引用只有一级,而指针可以有多级


3)指针传参的时候,还是值传递,指针本身的值不可以修改,需要通过解引用才能对指向的对象进行操作


引用传参的时候,传进来的就是变量本身,因此变量可以被修改


3、结构体struct和共同体union(联合)的区别


结构体:将不同类型的数据组合成一个整体,是自定义类型


共同体:不同类型的几个变量共同占用一段内存


1)结构体中的每个成员都有自己独立的地址,它们是同时存在的;


共同体中的所有成员占用同一段内存,它们不能同时存在;


2)sizeof(struct)是内存对齐后所有成员长度的总和,sizeof(union)是内存对齐后最长数据成员的长度、


结构体为什么要内存对齐呢?


1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常


2.硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升。


4、#define和const的区别


1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态区域


2)处理阶段不同,#define定义的宏变量在预处理时进行替换,可能有多个拷贝,const所定义的变量在编译时确定其值,只有一个拷贝。


3)#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址


4)#define可以定义简单的函数,const不可以定义函数


5、重载overload,覆盖(重写)override,隐藏(重定义)overwrite,这三者之间的区别


1)overload,将语义相近的几个函数用同一个名字表示,但是参数列表(参数的类型,个数,顺序不同)不同,这就是函数重载,返回值类型可以不同


特征:相同范围(同一个类中)、函数名字相同、参数不同、virtual关键字可有可无


2)override,派生类覆盖基类的虚函数,实现接口的重用,返回值类型必须相同


特征:不同范围(基类和派生类)、函数名字相同、参数相同、基类中必须有virtual关键字(必须是虚函数)


3)overwrite,派生类屏蔽了其同名的基类函数,返回值类型可以不同


特征:不同范围(基类和派生类)、函数名字相同、参数不同或者参数相同且无virtual关键字


6、new、delete、malloc、free之间的关系


new/delete,malloc/free都是动态分配内存的方式


1)malloc对开辟的空间大小严格指定,而new只需要对象名


2)new为对象分配空间时,调用对象的构造函数,delete调用对象的析构函数


既然有了malloc/free,C++中为什么还需要new/delete呢?


运算符是语言自身的特性,有固定的语义,编译器知道意味着什么,由编译器解释语义,生成相应的代码。


库函数是依赖于库的,一定程度上独立于语言的。编译器不关心库函数的作用,只保证编译,调用函数参数和返回值符合语法,生成call函数的代码。


malloc/free是库函数,new/delete是C++运算符。对于非内部数据类型而言,光用malloc/free无法满足动态对象都要求。new/delete是运算符,编译器保证调用构造和析构函数对对象进行初始化/析构。但是库函数malloc/free是库函数,不会执行构造/析构。


(顺便吆喝一下,技术大厂,前后端测试捞人,待遇还不错~



7、const知道吗?解释一下其作用


const修饰类的成员变量,表示常量不可能被修改


const修饰类的成员函数,表示该函数不会修改类中的数据成员,不会调用其他非const的成员函数


const函数只能调用const函数,非const函数可以调用const函数


8、虚函数是怎么实现的


每一个含有虚函数的类都至少有有一个与之对应的虚函数表,其中存放着该类所有虚函数对应的函数指针(地址),


类的示例对象不包含虚函数表,只有虚指针;


派生类会生成一个兼容基类的虚函数表。


9、堆和栈的区别


1)栈 stack 存放函数的参数值、局部变量,由编译器自动分配释放


堆heap,是由new分配的内存块,由应用程序控制,需要程序员手动利用delete释放,如果没有,程序结束后,操作系统自动回收


2)因为堆的分配需要使用频繁的new/delete,造成内存空间的不连续,会有大量的碎片


3)对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。


C++内存区域分为5个区域。分别是堆,栈,自由存储区,全局/静态存储区和常量存储区。


栈:由编译器在需要的时候分配,在不需要的时候自动清除的变量存储区。里面通常是局部变量,函数参数等。


堆:由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。


自由存储区:由malloc等分配的内存块,和堆十分相似,不过它使用free来结束自己的生命。


全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的c语言中。全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存。


常量存储区:这是一块比较特殊的存储区,里面存放的是常量,不允许修改。


C++内存区域中堆和栈的区别:


管理方式不同:栈是由编译器自动管理,无需我们手工控制;对于堆来说,释放由程序员完成,容易产生内存泄漏。


空间大小不同:一般来讲,在32为系统下面,堆内存可达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定空间大小的,例如,在vc6下面,默认的栈大小好像是1M。当然,也可以自己修改:打开工程。 project-->setting-->link,在category中选中output,然后再reserve中设定堆栈的最大值和 commit。


能否产生碎片:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。


生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。


分配方式不同:堆都是动态分配的;栈有静态和动态两种分配方式。静态分配由编译器完成,比如局部变量的分配。动态分配由malloca函数进行、但栈的动态分配和堆是不同的,它的动态分配由编译器进行释放,无需我们手工实现。


分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是c/c++库函数提供的,机制很复杂。库函数会按照一定的算法进行分配。显然,堆的效率比栈要低得多。


进程内存中的映像,主要有代码区,堆(动态存储区,new/delete的动态数据),栈,静态存储区



10、关键字static的作用


1)函数体内: static 修饰的局部变量作用范围为该函数体,不同于auto变量,其内存只被分配一次,因此其值在下次调用的时候维持了上次的值


2)模块内:static修饰全局变量或全局函数,可以被模块内的所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内


3)类中:修饰成员变量,表示该变量属于整个类所有,对类的所有对象只有一份拷贝


4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的static成员变量


注意和const的区别!!!const强调值不能被修改,而static强调唯一的拷贝,对所有类的对象


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-11-7 12:33 , Processed in 0.111909 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表