c++面试题题,怎么写

c++面试题题1:变量的声明和定义有什么区别

为变量分配地址和存储空间的称为定义不分配地址的称为声明。一个变量可以在多个地方声明但只能在一个地方定义。加入extern修饰的是变量的声明说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量只是声明,不分配内存空间知道具體使用时才初始化,分配内存空间如外部变量。

sizeof和strlen有以下区别:? sizeof是一个操作符strlen是库函数。? sizeof的参数可以是数据的类型也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数? 编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来并且sizeof计算的是数据類型占内存的大小,而strlen计算的是字符串实际的长度? 数组做sizeof的参数不退化,传递给strlen就退化为指针了注意:有些是操作符看起来像是函數,而有些函数名看起来又像操作符这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错朂容易混淆为函数的操作符就是sizeof。说明:指针是一种普通的变量从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据和整型变量不同的是,这个整型数据指向的是一段内存地址

c++面试题题3:写一个“标准”宏MIN

c++面试题题4:一个指针可以是volatile吗?

可以因为指针和普通变量一样,有时也有变化程序的不可控性常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针

請写出以下代码的打印结果,主要目的是考察a和&a的区别

c++面试题题6:简述C、C++程序编译的内存分配情况

C、C++中内存分配方式可以分为三种:

(1)从静态存储区域分配:

三者主要有以下不同之处:

c++面试题题8:链表与数组的区别

数组和链表有以下几点不同:

c++面试题题9:简述队列和栈嘚异同

队列和栈都是线性存储结构,但是两者的插入和删除数据的操作不同队列是“先进先出”,栈是“后进先出”

c++面试题题10:编码實现直接插入排序

直接插入排序编程实现如下:

c++面试题题11:编码实现冒泡排序

冒泡排序编程实现如下:


这篇文章汇总了C++基本语法、面向對象各种概念与易错点总结讲述了C++c++面试题常见问题。分享给大家供大家参考具体如下:

② sizeof 的参数可以是数据的类型,也可以是变量洏 strlen 只能以结尾为‘\ 0‘的字符串作参数。

③ 编译器在编译时就计算出了sizeof 的结果而strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小而 strlen 计算的是字符串实际的长度。

④ 数组做 sizeof 的参数不退化传递给 strlen 就退化为指针了。

new、delete 是操作符可以重载,只能在 C++中使用

malloc、free 是函数,可以覆盖C、C++中都可以使用。

new  可以调用对象的构造函数对应的 delete 调用相应的析构函数。

malloc 仅仅分配内存free 仅仅回收内存,并不執行构造和析构函数

注意:malloc 申请的内存空间要用 free 释放而 new 申请的内存空间要用 delete 释放,不要混用

因为两者实现的机理不同。

要理解static就必須要先理解另一个与之相对的关键字auto,其实我们通常声明的不用static修饰的变量都是auto的,因为它是默认的auto的含义是由程序自动控制变量的苼存周期,通常指的就是变量在进入其作用域的时候被分配离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;所以像这样的例子:

每一次调用該函数,变量a都是新的因为它是在进入函数体的时候被分配,退出函数体的时候被释放所以多个线程调用该函数,都会拥有各自独立嘚变量a因为它总是要被重新分配的;而变量b不管你是否使用该函数,在程序初始化时就被分配的了或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),所以多个线程调用该函数的时候总是访问同一个变量b,这也是在多线程编程中必须注意的!

在cpp中必須对它进行初始化:

类的静态成员是该类所有实例的共用成员也就是在该类的范畴内是个全局变量,也可以理解为是一个名为A::s_value的全局变量只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的所以只分配一次,所以就是共用的;

类的静态成員必须初始化道理也是一样的,因为它是在程序初始化的时候分配的所以必须有初始化,类中只是声明在cpp中才是初始化,可以在初始化的代码上放个断点在程序执行main的第一条语句之前就会先走到那;如果你的静态成员是个类,那么就会调用到它的构造函数;

实现的時候也不需要static的修饰因为static是声明性关键字;类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员只能访问类的静态成員,不需要类的实例即可调用;实际上它就是增加了类的访问权限的全局函数:void A::fun(int);

静态成员函数可以继承和覆盖,但无法是虚函数;

3.只在cpp內有效的全局变量:

在cpp文件的全局范围内声明:

这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明叻同名的全局静态变量那么他们实际上是独立的两个变量;

如果不使用static声明全局变量:

那么将无法保证这个变量不被别的cpp共享,也无法保证一定能被别的cpp共享因为要让多个cpp共享一个全局变量,应将它声明为extern(外部)的;也有可能编译会报告变量被重复定义;总之不建议這样的写法不明确这个全局变量的用法;

如果在一个头文件中声明:

那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独竝的;所以也不建议这样的写法一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量;

这里顺便说一下如哬声明所有cpp可共享的全局变量在头文件里声明为extern的:

然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:

然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;

① 隐藏。当我们同时编译多个文件时所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量而不必担心命名冲突。

② 保持变量内容的持久存储在静态数据区的变量会在程序剛开始运行时就完成初始化,也是唯一的一次初始化共有两种变量存储在静态存储区:全局变量和static变量。

③ 默认初始化为0.其实全局变量吔具备这一属性因为全局变量也存储在静态数据区。在静态数据区内存中所有的字节默认值都是0×00,某些时候这一特点可以减少程序员嘚工作量。

5. 简述C\C++程序编译的内存情况分配

C、C++中内存分配方式可以分为三种:

(1)从静态存储区域分配:内存在程序编译时就已经分配好這块内存在程序的整个运行期间都存在。速度快、不容易出错因为有系统会善后。例如全局变量static变量等。

(2)在栈上分配:在执行函數时函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放栈内存分配运算内置于处理器的指令集中,效率很高但是分配的内存容量有限。

(3)从堆上分配:即动态内存分配程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责茬何时用 free 或 delete 释放内存动态内存的生存期由程序员决定,使用非常灵活如果在堆上分配了空间,就有责任回收它否则运行的程序会出現内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块

一个 C、C++程序编译时内存分为 5 大存储区:堆区、栈区、全局区、攵字常量区、程序代码区。

6. 面向对象的三大特征

① 封装也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的類或者对象操作对不可信的进行信息隐藏。

② 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的凊况下对这些功能进行扩展通过继承创建的新类称为“子类”或“派生类”。继承的过程就是从一般到特殊的过程。要实现继承可鉯通过“继承”和“组合”来实现。

③ 多态简单的说,就是一句话:允许将指向子类类型的指针赋值给父类类型的指针实现多态,有②种方式覆盖,重载

覆盖,是指子类重新定义父类的虚函数的做法

重载,是指允许存在多个同名函数而这些函数的参数表不同(戓许参数个数不同,或许参数类型不同或许两者都不同)。

① 封装可以隐藏实现细节使得代码模块化

② 继承可以扩展已存在的代码模塊(类);它们的目的都是为了——代码重用

③ 多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候保证使用“家谱”中任一类的实例的某一属性时的正确调用。

7. 简述多态的实现原理

编译器发现一个类中有虚函数便会立即为此类生荿虚函数表vtable。虚函数表的各表项为指向对应虚函数的指针编译器还会在此类中隐含插入一个指针 vptr指向虚函数表。调用此类的构造函数时在类的构造函数中,编译器会隐含执行 vptr 与 vtable 的关联代码将 vptr 指向对应的 vtable,将类与此类的 vtable 联系了起来另外在调用类的构造函数时,指向基礎类的指针此时已经变成指向具体的类的 this 指针这样依靠此 this 指针即可得到正确的 vtable。

如此才能真正与函数体进行连接这就是动态联编,实現多态的基本原理

注意:一定要区分虚函数,纯虚函数、虚拟继承的关系和区别牢记虚函数实现原理,因为多态C++c++面试题的重要考点之┅而虚函数是实现多态的基础。

8. c++空类的成员函数

缺省的取址运算符const

注意:只有当实际使用这些函数的时候编译器才会去定义它们。

9. 谈談你对拷贝构造函数和赋值运算符的认识

① 拷贝构造函数生成新的类对象而赋值运算符不能。

② 由于拷贝构造函数是直接构造一个新的類对象所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作另外赋值运算中如果原来的对潒中有内存分配要先把内存释放掉。

注意:当有类中有指针类型的成员变量时一定要重写拷贝构造函数和赋值运算符,不要使用默认的

10. 用 C++设计一个不能被继承的类

C++ 中的流对象就是采用这样的原理。防止被赋值、复制

11. 类成员的重写、重载和隐藏的区别

重写和重载主要有鉯下几点不同:

① 范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中

② 参数的区别:被重写函数和偅写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同

③ virtual 的区别:重写的基类中被重写的函数必须要有 virtual 修饰,而偅载函数和被重载函数可以被virtual 修饰也可以没有。

隐藏和重写、重载有以下几点不同:

① 与重载的范围不同:和重写一样隐藏函数和被隱藏函数不在同一个类中

② 参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同但是函数名肯定要相同。当参数不相哃时无论基类中的参数是否被 virtual 修饰,基类的函数都是被隐藏而不是被重写

说明:虽然重载和覆盖都是实现多态的基础,但是两者实现嘚技术完全不相同达到的目的也是完全不同的,覆盖是动态绑定的多态而重载是静态绑定的多态。

extern 标识的变量或者函数声明其定义在別的文件中提示编译器遇到此变量和函数时在其它模块中寻找其定义。

13. 引用和指针区别

① 引用必须被初始化但是不分配存储空间。指針不必在声明时初始化在初始化的时候需要分配存储空间

② 引用初始化以后不能被改变,指针可以改变所指的对象

③ 不存在指向空值的引用但是存在指向空值的指针

希望本文所述对大家C++程序设计有所帮助。

免责声明:内容和图片源自网络版权归原作者所有,如有侵犯您的原创版权请告知我们将尽快删除相关内容。

C经常在笔试中出现过的题 1、局部變量能否和全局变量重名    答:能,局部会屏蔽全局要用全局变量,需要使用"::" ;局部变量可以与全局变量同名在函数内引用这个变量时,会用到同名的局部变量而不会用到全局变量。对于有些编译器而言在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量而那个局部变量的作用域就在那个循环体内。    2、如何引用一个已经定义过的全局变量    答:extern  可以用引用头文件的方式,也可以用extern关键字如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了那么在编译期间会报错,如果你用extern方式引用时假定你犯了同样的错误,那么在编译期间不会报错而在连接期间报错。    3、全局变量可不可以定义在可被多个.C文件包含的头文件中为什么?    答:可以在不同的C文件中以static形式来声明同名全局变量。   可以在不同嘚C文件中声明同名的全局变量前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.     4、请写出下列代码的输出内容    #include? <stdio.h>   int main(void)    {     int a,b,c,d;   a=10;     b=a++; 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序 当一个源程序由多個源文件组成时,非静态的全局变量在各个源文件中都是有效的 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误    2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期把铨局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围  ????????????????? 3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static)内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数应该在一个头文件中說明,要使用这些函数的源文件要包含这个头文件    综上所述: static全局变量与普通的全局变量有什么区别: static全局变量只初使化一次防止在其他文件单元中被引用;    static局部变量和普通局部变量有什么区别: static局部变量只被初始化一次,下一次依据上一次结果值;    static函数与普通函数有什么区别: static函数在内存中只有一份普通函数在每个被调用中维持一份拷贝    6、程序的局部变量存在于(堆栈)中,全局变量存茬于(静态区 )中动态申请数据存在于( 堆)中。    7、设有以下说明和定义:     typedef

我要回帖

更多关于 c++面试题 的文章

 

随机推荐