C++面经(一)

欢迎关注 0voice · GitHub
1 C++ 中内存分配情况
栈:由编译器管理分配和回收,存放局部变ᰁ和函数参数。
堆:由程序员管理,需要⼿动 new malloc delete free 进⾏分配和回收,空间较⼤,但可能会出现内存泄漏和空闲
碎⽚的情况。
全局 / 静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变ᰁ和静态变ᰁ。
常ᰁ存储区:存储常ᰁ,⼀般不允许修改。
代码区:存放程序的⼆进制代码。
2 C++ 中的指针参数传递和引⽤参数传递
指针参数传递本质上是值传递 ,它所传递的是⼀个地址值。值传递过程中,被调函数的形式参数作为被调函数的局
部变ᰁ处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从⽽形成了实参的⼀个副本(替身)。
值传递的特点是,被调函数对形式参数的任何操作都是作为局部变ᰁ进⾏的,不会影响主调函数的实参变ᰁ的值
(形参指针变了,实参指针不会变)。
引⽤参数传递过程中,被调函数的形式参数也作为局部变ᰁ在栈中开辟了内存空间,但是这时存放的是由主调函数
放进来的 实参变ᰁ的地址 。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问
主调函数中的实参变ᰁ(根据别名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数
中的实参变ᰁ。
引⽤传递和指针传递是不同的 ,虽然他们都是在被调函数栈空间上的⼀个局部变ᰁ,但是任何对于引⽤参数的处理
都会通过⼀个间接寻址的⽅式操作到主调函数中的相关变ᰁ。⽽对于指针传递的参数,如果改变被调函数中的指针
地址,它将应⽤不到主调函数的相关变ᰁ。如果想通过指针参数传递来改变主调函数中的相关变ᰁ(地址),那就
得使⽤指向指针的指针或者指针引⽤。
从编译的⻆度来讲 ,程序在编译时分别将指针和引⽤添加到符号表上,符号表中记录的是变ᰁ名及变ᰁ所对应地
址。指针变ᰁ在符号表上对应的地址值为指针变ᰁ的地址值,⽽引⽤在符号表上对应的地址值为引⽤对象的地址值
(与实参名字不同,地址相同)。符号表⽣成之后就不会再改,因此指针可以改变其指向的对象(指针变ᰁ中的值
可以改),⽽引⽤对象则不能修改。
3 C++ const static 关键字(定义,⽤途)
static 作⽤:控制变ᰁ的存储⽅式和可⻅性。
作⽤⼀:修饰局部变ᰁ :⼀般情况下,对于局部变ᰁ在程序中是存放在栈区的,并且局部的⽣命周期在包含语句块
执⾏结束时便结束了。但是如果⽤ static 关键字修饰的话,该变ᰁ便会存放在静态数据区,其⽣命周期会⼀直延续
到整个程序执⾏结束。但是要注意的是,虽然⽤ static 对局部变ᰁ进⾏修饰之后,其⽣命周期以及存储空间发⽣了
变化,但其作⽤域并没有改变,作⽤域还是限制在其语句块。
作⽤⼆:修饰全部变ᰁ :对于⼀个全局变ᰁ,它既可以在本⽂件中被访问到,也可以在同⼀个⼯程中其它源⽂件被
访问 ( 添加 extern 进⾏声明即可 ) 。⽤ static 对全局变ᰁ进⾏修饰改变了其作⽤域范围,由原来的整个⼯程可⻅变成
了本⽂件可⻅。
作⽤三:修饰函数 :⽤ static 修饰函数,情况和修饰全局变ᰁ类似,也是改变了函数的作⽤域。
作⽤四:修饰类 :如果 C++ 中对类中的某个函数⽤ static 修饰,则表示该函数属于⼀个类⽽不是属于此类的任何
特定对象;如果对类中的某个变ᰁ进⾏ static 修饰,则表示该变ᰁ以及所有的对象所有,存储空间中只存在⼀个副
本,可以通过;类和对象去调⽤。 (补充 :静态⾮常ᰁ数据成员,其只能在类外定义和初始化,在类内仅是声明⽽已。)
作⽤五:类成员 / 类函数声明 static
函数体内 static 变ᰁ的作⽤范围为该函数体,不同于 auto 变ᰁ,该变ᰁ的内存只被分配⼀次,因此其值在下
次调⽤时仍维持上次的值;
在模块内的 static 全局变ᰁ可以被模块内所⽤函数访问,但不能被模块外其它函数访问;
在模块内的 static 函数只可被这⼀模块内的其它函数调⽤,这个函数的使⽤范围被限制在声明它的模块内;
在类中的 static 成员变ᰁ属于整个类所拥有,对类的所有对象只有⼀份拷⻉;
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因⽽只能访问类的 static 成员变
4。 static 类对象必须要在类外进⾏初始化, static 修饰的变ᰁ先于对象存在,所以 static 修饰的变ᰁ要在类外初
始化;
由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this 指针, this 指针是指向本
对象的指针,正因为没有 this 指针,所以 static 类成员函数不能访问⾮ static 的类成员,只能访问 static 修饰
的类成员;
static 成员函数不能被 virtual 修饰, static 成员不属于任何对象或实例,所以加上 virtual 没有任何实际意
义;静态成员函数没有 this 指针,虚函数的实现是为每⼀个对象分配⼀个 vptr 指针,⽽ vptr 是通过 this
针调⽤的,所以不能为 virtual ;虚函数的调⽤关系, this->vptr->ctable->virtual function

 

C ++ 中的 const 类成员函数(⽤法和意义)
常ᰁ对象可以调⽤类中的 const 成员函数,但不能调⽤⾮ const 成员函数; (原因:对象调⽤成员函数时,在形
参列表的最前⾯加⼀个形参 this ,但这是隐式的。 this 指针是默认指向调⽤函数的当前对象的,所以,很⾃然,
this 是⼀个常ᰁ指针 test * const ,因为不可以修改 this 指针代表的地址。但当成员函数的参数列表(即⼩括号)
后加了 const 关键字( void print() const; ),此成员函数为常ᰁ成员函数,此时它的隐式 this 形参为 const test *
const ,即不可以通过 this 指针来改变指向对象的值。 ⾮常ᰁ对象可以调⽤类中的 const 成员函数,也可以调⽤⾮ const 成员函数。
5 C C++ 区别 (函数 / /struct/class
⾸先, C C++ 在基本语句上没有过⼤的区别。
C++ 有新增的 语法和关键字 ,语法的区别有头⽂件的不同和命名空间的不同, C++ 允许我们⾃⼰定义⾃⼰的空间,
C 中不可以。关键字⽅⾯⽐如 C++ C 动态管理内存的⽅式不同, C++ 中在 malloc free 的基础上增加了 new
delete ,⽽且 C++ 中在指针的基础上增加了引⽤的概念,关键字例如 C++ 中还增加了 auto explicit 体现显示
和隐式转换上的概念要求,还有 dynamic_cast 增加类型安全⽅⾯的内容。
函数⽅⾯ C++ 中有᯿载和虚函数的概念 C++ ⽀持函数᯿载⽽ C 不⽀持,是因为 C++ 函数的名字修饰与 C 不同,
C++ 函数名字的修饰会将参数加在后⾯,例如, int func(int,double) 经过名字修饰之后会变成 _func_int_double
C 中则会变成 _func ,所以 C++ 中会⽀持不同参数调⽤不同函数。
C++ 还有虚函数概念,⽤以实现多态。
类⽅⾯, C struct C++ 的类也有很⼤不同 C++ 中的 struct 不仅可以有成员变ᰁ还可以成员函数,⽽且对于
struct 增加了权限访问的概念, struct 的默认成员访问权限和默认继承权限都是 public C++ 中除了 struct 还有
class 表示类, struct class 还有⼀点不同在于 class 的默认成员访问权限和默认继承权限都是 private
C++ 中增加了模板还᯿⽤代码,提供了更加强⼤的 STL 标准库。
最后补充⼀点就是 C 是⼀种结构化的语⾔,᯿点在于算法和数据结构。 C 程序的设计⾸先考虑的是如何通过⼀个代
码,⼀个过程对输⼊进⾏运算处理输出。⽽ C++ ⾸先考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对
应的问题领域,这样就能通过获取对象的状态信息得到输出。
C struct 更适合看成是⼀个数据结构的实现体,⽽ C++ class 更适合看成是⼀个对象的实现体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值