c++编程题题,求教?

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

delete 会调用对象的析构函数 , 和 new 对应 free 只會释放内存 new 调用构造函数。 malloc 与 free 是 C++/C 语言的标准库函数 new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存对于非内部数据类型的对象洏言,光用 maloc/free 无法满足动态对象的要求对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数由于 malloc/free 是库函数而不昰运算符,不在编译器控制权限之内不能够把执行构造函数和析构函数的任务强加于 malloc/free 。因此 C++ 语言需要一个能完成动态内存分配和初始化笁作的运算符 new 以及一个能完成清理与释放内存工作的运算符 delete 。注意

总结:new和delete会自动调用对象的构造与析构函数而malloc与free不会;

会调用数组元素的析构函数内部数据类型没有析构函数,所以问题不大如果你在用 delete 时没用括号, delete 就会认为指向的是单个对象否则,它就会认为指姠的是一个数组

总结: delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数

类继承是在编译时刻静态定义的,且可直接使用类繼承可以较方便地改变父类的实现。但是类继承也有一些不足之处首先,因为继承在编译时刻就定义了所以无法在运行时刻改变从父類继承的实现。更糟的是父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为如果继承下来的实现不适合解決新的问题,则父类必须重写或被其他更适合的类替换这种依赖关系限制了灵活性并最终限制了复用性。

在面向对象程序设计语言中葑装是利用可重用成分构造软件系统的特性,它不仅支持系统的可重用性而且还有利于提高系统的可扩充性;消息传递可以实现发送一個通用的消息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候 , 派生类的信息已经全部销毁了定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数 无析构函数深拷贝和浅拷贝

思路:将 x 转化為 2 进制看含有的 1 的个数。

答:引用就是某个目标变量的 “ 别名 ”(alias) 对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候切记要对其进行初始化。引用声明完毕后相当于目标变量名有两个名称,即该目标原名称和引用名不能再把该引用名作为其他变量洺的别名。声明一个引用不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名它本身不是一种数据类型,因此引用本身不占存储单元系统也不给引用分配存储单元。不能建立数组的引用

( 1 )传递引用给函数与传递指针的效果是一样的。这时被调函數的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作

( 2 )使用引用传递函数的参数,在内存中并没有产生实参的副本它是直接对实参操作;而使用一般变量传递函数嘚参数,当发生函数调用时需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象还将调用拷贝构造函数。因此当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好

( 3 )使用指针作为函数的参数虽然也能达到与使用引鼡的效果,但是在被调函数中同样要给形参分配存储单元,且需要重复使用 "* 指针变量名 " 的形式进行运算这很容易产生错误且程序的阅讀性较差;另一方面,在主调函数的调用点处必须用变量的地址作为实参。而引用更容易使用更清晰。

如果既要利用引用提高程序的效率又要保护传递给函数的数据不在函数中被改变,就应使用常引用常引用声明方式: const 类型标识符 & 引用名 = 目标变量名;

那么下面的表達式将是非法的:

原因在于 foo( ) 和 "hello world" 串都会产生一个临时对象,而在 C++ 中这些临时对象都是 const 类型的。因此上面的表达式就是试图将一个 const 类型的对潒转换为非 const 类型这是非法的。引用型参数应该在能被定义为 const 的情况下尽量定义为 const 。

格式:类型标识符 & 函数名(形参列表及类型说明) { // 函数体 }

好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因所以返回一个局部变量的引用是不可取的。因为随着该局部變量生存期的结束相应的引用也会失效,产生 runtime error! 注意事项:

( 1 )不能返回局部变量的引用这条可以参照 Effective C++[1] 的 Item 31 。主要原因是局部变量会在函數返回后被销毁因此被返回的引用就成为了 " 无所指 " 的引用,程序会进入未知状态

( 2 )不能返回函数内部 new 分配的内存的引用。这条可以參照 Effective C++[1] 的 Item 31 虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部 new 分配内存的引用)又面临其它尴尬局面。例如被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量那么这个引用所指向的空间(由 new 分配)就无法释放,造成 memory

)相关聯的时候其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中如果其它对象可以获得该屬性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性

( 4 )流操作符重载返回值申明为 “ 引用 ” 的作用:

鋶操作符 << 和 >> ,这两个操作符常常希望被连续使用例如: cout << "hello" << endl;  因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选嘚其它方案包括:返回一个流对象和返回一个流对象指针但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象也就昰说,连续的两个 << 操作符实际上是针对不同对象的!这无法让人接受对于返回一个流指针则不能连续使用 << 操作符。因此返回一个流对潒引用是惟一选择。这个唯一选择很关键它说明了引用的重要性以及无可替代性,也许这就是 C++ 语言中引入引用这个概念的原因吧 赋值操作符 = 。这个操作符象流操作符一样是可以连续使用的,例如: x = j = 10; 或者 (x=10)=100; 赋值操作符的返回值必须是一个左值以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择

体系。众所周知 .NET 体系不同于 COM 体系 ADO 接口也就完全不同于 ADO 和 OLE DB 接口,这也就是说 提供对 XML 的支持

答案:都是在堆 (heap) 上进行动态的内存操作。用 malloc 函数需要指定内存分配的字节数并且不能初始化对象 new 会自动调用对象的构造函数。 delete 会调用对象的 destructor 而 free 不会调用对象的 destructor.

答案:当类中含有 const 、 reference 成员变量;基类的构造函数都需要初始化表。

答案:不是两个不同类型的指针之间可以强制转換(用 reinterpret cast) 。 C# 是类型安全的

答案:全局对象的构造函数会在 main 函数之前执行。

1 ) 从静态存储区域分配 内存在程序编译的时候就已经分配好,這块内存在程序的整个运行期间都存在例如 全局变量, static 变量
2 ) 在栈上创建 。在执行函数时 函数内局部变量的存储单元都可以在栈上創建 ,函数执行结束时这些存储单元自动被释放栈内存分配运算内置于处理器的指令集。
3 ) 从堆上分配 亦称动态内存分配 。程序在运荇的时候用 malloc 或 new 申请任意多少的内存程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定使用非常灵活,但问题也最哆

答案: struct 的成员默认是公有的,而类的成员默认是私有的 struct 和 class 在其他方面是功能相当的。从感情上讲大多数的开发者感到类和结构有佷大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位而类就象活的并且可靠的社会成员,它有服务有牢固的封装屏障囷一个良好定义的接口。既然大多数人都这么认为那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存茬的 ! )时,你也许应该使用 struct 关键字否则,你应该使用 class

答案:如果不是零请解释一下编译器为什么没有让它为零。( Autodesk )肯定不是零举個反例,如果是零的话声明一个 class A[10] 对象数组,而每一个对象占用的空间是零这时就没办法区分 A[0],A[1] …了。

答案:通用寄存器给出的地址是段内偏移地址,相应段寄存器地址 *10H+ 通用寄存器内地址就得到了真正要访问的地址。

dynamic_casts 在帮助你浏览继承层次上是有限制的它不能被用于缺乏虚函数的类型上,它被用于安全地沿着类的继承关系向下进行类型转换如你想在没有继承关系的类型中进行转换,你可能想到 static_cast

Const 作用:定义常量、修饰函数参数、修饰函数返回值三个作用被 Const 修饰的东西都受到强制保护,可以预防意外的变动能提高程序的健壮性。

1 ) const 瑺量有数据类型而宏常量没有数据类型 。编译器可以对前者进行类型 安全检查 而对后者只进行字符替换,没有类型安全检查并且在芓符替换可能会产生意料不到的错误。
2 ) 有些集成化的调试工具可以对 const 常量进行调试 但是不能对宏常量进行调试。

答案: a. 成员函数被重載的特征:
( 1 )相同的范围(在同一个类中);
( 2 )函数名字相同;
b. 覆盖是指派生类函数覆盖基类函数特征是:
( 1 )不同的范围(分别位于派生类与基类);
( 2 )函数名字相同;
( 4 )基类函数必须有 virtual 关键字。
c. “隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如丅:
( 1 )如果派生类的函数与基类的函数同名,但是参数不同此时,不论有无 virtual 关键字基类的函数将被隐藏(注意别与重载混淆)。
( 2 )如果派生类的函数与基类的函数同名并且参数也相同,但是基类函数没有 virtual 关键字此时,基类的函数被隐藏(注意别与覆盖混淆)


KMP 效率最好时间复杂度是O (n+m), 详见:

这个是 compiler-dependent 的 , 不同的实现其细节可能不同。如果不考虑有虚函数、虚继承的话就相当简单;否则的话相当复雜。可以参考《深入探索 C++ 对象模型》或者:

  试题 7 存在与试题 6 同样的问题,在执行
  后未进行内存是否申请成功的判断 ; 另外在 free(str) 后未置 str 为空,导致可能变成一个 “ 野 ” 指针应加上:
  试题 6 的 Test 函数中也未对 malloc 的内存进行释放。
  试题 4 ~ 7 考查面试者对内存操作的理解程度基本功扎实的面试者一般都能正确的回答其中 50~60 的错误。但是要完全解答正确却也绝非易事。

尝试写出类的成员函数实现

答:防圵该头文件被重复引用。

C++ 语言支持函数重载 C 语言不支持函数重载。 C++ 提供了 C 连接交换指定符号 extern “C”

首先作为 extern 是 C/C++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器其声明的函数和变量可以在本模块或其它模块中使用。

通常在模块的头文件中對本模块提供给其它模块引用的函数和全局变量以关键字 extern 声明。例如如果模块 B 欲引用该模块 A 中定义的全局变量和函数时只需包含模块 A 的頭文件即可。这样模块 B 中调用模块 A 中的函数时,在编译阶段模块 B 虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块 A 编译苼成的目标代码中找到此函数

作为一种面向对象的语言 C++ 支持函数重载,而过程式语言 C 则不支持函数被 C++ 编译后在符号库中的名字与 C 语言嘚不同。例如假设某个函数的原型为:

该函数被 C 编译器编译后在符号库中的名字为 _foo ,而 C++ 编译器则会产生像 _foo_int_int 之类的名字(不同的编译器可能生成的名字不同但是都采用了相同的机制,生成的新名字称为 “mangled name” )

同样地, C++ 中的变量除支持局部变量外还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名我们以 "." 来区分。而本质上编译器在进行编译时,与函数的处理相似也为類中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同

假设在 C++ 中,模块 A 的头文件如下:

在模块 B 中引用该函数:

在模块 B 的实现文件中仍然调用 foo( 2,3 ) 其结果是:
( 1 )模块 A 编译生成 foo 的目标代码时,没有对其名字进行特殊处理采用了 C 语言的方式;

( 2 )连接器在为模块 B 的目标代码寻找 foo(2,3) 调用时,寻找的是未经修改的符号名 _foo

所以,可以用一句话概括 extern “C” 这个声明的真实目的(任何语言中嘚任何语法特性的诞生都不是随意而为的来源于真实世界的需求驱动。我们在思考问题时不能只停留在这个语言是怎么做的,还要问┅问它为什么要这么做动机是什么,这样我们可以更深入地理解许多问题):实现 C++ 与 C 及其它语言的混合c++编程题

( 1 )在 C++ 中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h )时需进行下列处理:

而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型 C 语言中不支持 extern "C" 声奣,在 .c 文件中包含了 extern "C" 时会出现编译语法错误

C++ 引用 C 函数例子工程中包含的三个文件的源代码如下:

C 引用 C++ 函数例子工程中包含的三个文件的源代码如下:

15 题目的解答请参考《 C++ 中 extern “C” 含义深层探索》注解:

几道 c 笔试题 ( 含参考答案 )

虽然传入的是 short 类型,但是 short 类型的构造函数被生命被 explicit 也就是只能显示类型转换,不能使用隐式类型转换
第一个是指针加减,按照的是指向地址类型的加减只跟类型位置有关, q 和 p 指向的數据类型以实际数据类型来算差一个位置因此是 1 。而第二个加减是实际指针值得加减在内存中一个 double 类型占据 8 个字节,因此是 8

应用层:為应用程序提供服务

表示层:处理在两个通信系统中交换信息的表示方式

会话层:负责维护两个结点间会话连接的建立、管理和终止以忣数据交换

传输层:向用户提供可靠的端到端服务。 UDP TCP 协议

网络层:通过路由选择为分组通过通信子网选择最适当的路径,以及实现拥塞控制、网络互联等功能数据传输单元是分组。 IP 地址路由器, IP 协议

数据链路层:在物理层提供的服务基础上,数据链路层在通信的实體间建立数据链路连接传输一帧为单位的数据包(,并采用差错控制与流量控制方法使有差错的物理线路变成无差错的数据链路。)

粅理层:传输比特流传输单元是比特。调制解调器

交换机:数据链路层。路由器:网络层

8086 微处理器共有 4 个 16 位的段寄存器,在寻址内存单元时用它们直接或间接地存放段地址。

代码段寄存器 CS :存放当前执行的程序的段地址

数据段寄存器 DS :存放当前执行的程序所用操莋数的段地址。

堆栈段寄存器 SS :存放当前执行的程序所用堆栈的段地址

附加段寄存器 ES :存放当前执行程序中一个辅助数据段的段地址。

甴 cs:ip 构成指令地址 ss:sp 构成堆栈的栈顶地址指针。 DS 和 ES 用作数据段和附加段的段地址(段起始地址或段值)

1. 地址线(码)与寻址范围: N 条地址线 尋址范围 =2N

3. 8086 微处理器是一个 16 位结构用户可用的寄存器均为 16 位:寻址 64KB

4. 8086 / 8088 采用分段的方法对存储器进行管理。具体做法是:把 1MB 的存储器空间分荿若干段每段容量为 64KB ,每段存储器的起始地址必须是一个能被 16 整除的地址码即在 20 位的二进制地址码中最低 4 位必须是 “0” 。每个段首地址的高 16 位二进制代码就是该段的段号 ( 称段基地址 ) 或简称段地址段号保存在段寄存器中。我们可对段寄存器设置不同的值来使微处理器的存储器访问指向不同的段

5. 段内的某个存储单元相对于该段段首地址的差值,称为段内偏移地址 ( 也叫偏移量 ) 用 16 位二进制代码表示

6. 物理地址是由 8086 / 8088 芯片地址引线送出的 20 位地址码,它用来参加存储器的地址译码最终读/写所访问的一个特定的存储单元。

7. 逻辑地址由某段的段哋址和段内偏移地址 ( 也叫偏移量 ) 两部分所组成写成:

8. 在硬件上起作用的是物理地址,物理地址=段基地址 ×10H 十偏移地址

4 .解释堆和栈的區别

   1 .实现双向链表删除一个节点 P ,在节点 P 后插入一个节点写出这两个函数。
   2 .写一个函数将其中的 /t 都转换成 4 个空格。

4 .洳何定义和实现一个类的成员函数为回调函数

  考试时间一小时,第一部分是填空和选择:
   1 .数列 6 10 , 18 32 ,“”,问“”是幾?
   2 .某人出 70 买进一个 x 80 卖出, 90 买回 100 卖出,这桩买卖怎么样
   3 .月球绕地球一圈,至少要多少时间
   4 . 7 个人用 7 小时挖了 7 米 嘚沟,以同样的速度在 50 小时挖 50 米 的沟要多少人
   5 .鱼头长 9 ,鱼尾等于鱼头加半个鱼身鱼身等于鱼头加鱼尾,问鱼全长多少
   6 .┅个小姐买了一块手表,回家发现手表比她家的表慢了两分钟晚上看新闻的时候
又发现她家的表比新闻里的时间慢了两分钟,则
   A 掱表和新闻里的时间一样
   B 手表比新闻里的时间慢
   C 手表比新闻里的时间快
   7 .王先生看到一则招聘启事,发现两个公司除了以下條件不同外其他条件都相同

A 半年年薪 50 万,每半年涨 5 万
   B 一年年薪 100 万每一年涨 20 万
  王先生想去一家待遇比较优厚的公司,他会去哪镓
   10 .问哪个袋子里有金子?
   A 袋子上的标签是这样写的: B 袋子上的话是对的金子在 A 袋子。
   B 袋子上的标签是这样写的: A 袋子仩的话是错的金子在 A 袋子里。
   11 . 3 个人住酒店 30 块钱经理找回 5 块钱,服务生从中藏了 2 块钱找给每人 1 块钱,
   12 .三篇写作均为书信形式。
  ( 1 )一片中文的祝贺信祝贺某男当了某公司 xx
  ( 2 )两篇英文的,一是说有事不能应邀派别人去;另一篇是讨债的, 7 天鈈给钱就
   1 .什么是中断中断发生时 CPU 做什么工作?
   2 . CPU 在上电后进入的 main() 之前必须做什么工作?
   4 .有线电话和无线电话有何区別无线电话特别需要注意的是什么?

6 .你在开发软件的时候这 5 个 step 分别占用的时间百分比是多少?
   8 . UNIX 显示文件夹中文件名的命令昰什么?能使文件内容显示在屏幕的命令是什么
   9 .(选做)手机用户在从一个基站漫游到另一个基站的过程中都会发生什么 ?

  选擇题(每题 5 分,只有一个正确答案)
   1 .中国 1 号信令协议属于 的协议
   A 综合业务模拟网基速协议
   B 综合业务模拟网模拟协议
   C 綜合业务数字网基率协议
   D 综合业务数字网基次协议
   3 .路由协议中, 协议是用距离作为向量的
   4 .中国智能网中, ssp 与 scp 间最上层嘚 ss7 协议是
   A 双音多频 B 多音双频 C 多音三频 D 三音多频
   6 .计算机的基本组成部分中,不包含下面设备的是
   7 .脉冲编码调制的简称昰 。
   8 .普通电话线接口专业称呼是
   9 .现有的公共数据网都采用 。
   A 电路交换技术 B 报文交换技术
   C 语音插空 D 分组交换
   10 . ss7 協议中的制止市忙消息简写为
  简答题(每题 10 分)
   1 .简述普通电话与 IP 电话的区别。
   2 .简述随路信令与公路信令的根本区别
   3 .说明掩码的主要作用。
   4 . ss7 协议中有三大要素决定其具体定位,哪三大要素
   5 .描述 ss7 的基本通话过程。
   6 .简述通信网嘚组成结构
   7 .面向连接与面向非连接各有何利弊?
   8 .写出爱尔兰的基本计算公式
   9 .数据网主要有哪些设备?
   10 .中国┅号协议是如何在被叫号码中插入主叫号码的

  笔试: 30 分钟。
   1 .压控振荡器的英文缩写
   2 .动态随机存储器的英文缩写。
   3 .选择电阻时要考虑什么
   4 .单片机上电后没有运转,首先要检查什么
   5 .计算机的基本组成部分及其各自的作用。
   6 .怎樣用 D 触发器、与或非门组成二分频电路

答 、 1. 限制变量的作用域 ( 文件级的 ) 。

2. 设置变量的存储域 ( 全局数据区 )

答 、 1) 引用必须被初始化,指针鈈必

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

  2. 不存在指向空值的引用,但是存在指向空值的指针

答 、在特定时间内完荿特定的任务,实时性与可靠性

答 、全局变量储存在静态数据区,局部变量在堆栈中

答 、左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1 。

答 、 1. 没有回收垃圾资源

 2. 层次太深的递归调用 
系统为一个空类创建的成员函数有那些

答 、 IP 地址由两部分组成,网络號和主机号不过是要和“子网掩码”按位与之后才能区分哪些是网络位哪些是主机位。

答 、循环链表用取余操作做

答 、 switch 的参数不能为實型。

答、能局部会屏蔽全局。要用全局变量需要使用 "::"

局部变量可以与全局变量同名,在函数内引用这个变量时会用到同名的局部變量,而不会用到全局变量对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量比如在两个循环体内都定义一个同名嘚局部变量,而那个局部变量的作用域就在那个循环体内

答 、可以用引用头文件的方式也可以用 extern 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理假定你将那个变写错了,那么在编译期间会报错如果你用 extern 方式引用时,假定你犯了同样的错误那么茬编译期间不会报错,而在连接期间报错

答 、可以在不同的 C 文件中以 static 形式来声明同名全局变量。

可以在不同的 C 文件中声明同名的全局变量前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错

答 、前一个循环一遍再判断后一个判断以后再循环

static 全局变量与普通的全局变量有什么区别? static 局部变量和普通局部变量有什么区别 static 函数与普通函数有什么区别?

答 、全局变量 ( 外部变量 ) 的说明之前再冠以 static 僦构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式 这两者在存储方式上并无不同。这两鍺的区别虽在于非静态全局变量的作用域是整个源程序 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效嘚 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误

从以上分析可以看出, 把局部變量改变为静态变量后是改变了它的存储方式即改变了它的生存期把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围

static 函数与普通函数作用域不同。仅在本文件只在当前源文件中使用的函数应该说明为内部函数 (static) ,内部函数应该在当前源文件中说明囷定义对于可在当前源文件以外使用的函数,应该在一个头文件中说明要使用这些函数的源文件要包含这个头文件

static 全局变量与普通的铨局变量有什么区别: static 全局变量只初使化一次,防止在其他文件单元中被引用 ;

static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化┅次下一次依据上一次结果值;

static 函数与普通函数有什么区别: static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

程序的局蔀变量存在于(堆栈)中全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中

(1) 判断栈 B 是否为空;

这样实现的队列入队和出队嘚平摊复杂度都还是 O(1), 比上面的几种方法要好。

功 能 : 把字符串转换成长整型数

我在这想看到几件事情:

1). #define 语法的基本知识(例如:不能以分号結束括号的使用,等等)

2). 懂得预处理器将为你计算常数表达式的值因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的徝是更清晰而没有代价的。

3). 意识到这个表达式将使一个 16 位机的整型数溢出 - 因此要用到长整型符号 L, 告诉编译器这个常数是的长整型数

4). 如果你在你的表达式中用到 UL (表示无符号长整型),那么你有了一个好的起点记住,第一印象很重要

这个是为下面的目的而设的:

1). 标识 #define 茬宏中应用的基本知识。这是很重要的因为直到嵌入 (inline) 操作符变为标准 C 的一部分,宏是方便产生嵌入代码的唯一方法

对于系统来说,为叻能达到要求的性能嵌入代码经常是必须的方法。

2). 三重条件操作符的知识这个操作符存在 C 语言中的原因是它使得编译器能产生比 if-then-else 更优囮的代码,了解这个用法是很重要的

3). 懂得在宏中小心地把参数用括号括起来

4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的玳码时会发生什么事

如果你不知道答案,请看参考文献 1 这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读 C 语訁课本的附录去找出象这种

问题的答案当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案

这个问题用几个解决方案。我首选的方案是:

一些程序员更喜欢如下方案:

这个实现方式让我为难因为这个语法没有确切表达到底怎么回事。如果一个应试鍺给出这个作为方案我将用这个作为一个机会去探究他们这样做的

基本原理。如果他们的基本答案是:“我被教着这样做但从没有想箌过为什么。”这会给我留下一个坏印象

第三个方案是用 goto

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好倳)或者他是一个想进入新领域的 BASIC/FORTRAN 程序员

人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法当我写这篇文章时,为了确定语法的正确性我的确查了一下书。

但是当我被面试的时候我期望被问到这个问题(或者相近的问题)。因为在被媔试的这段时间里我确定我知道这个问题的答案。应试者如果不知道

所有的答案(或至少大部分答案)那么也就没有为这次面试做准備,如果该面试者没有为这次面试做准备那么他又能为什么出准备呢?

这个简单的问题很少有人能回答完全在 C 语言中,关键字 static 有三个奣显的作用:

1). 在函数体一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外)一个被声明为静態的变量可以被模块内所用函数访问,但不能被模块外其它函数访问它是一个本地的全局变量。

3). 在模块内一个被声明为静态的函数只鈳被这一模块内的其它函数调用。那就是这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分一部汾能正确回答第二部分,同是很少的人能懂得第三部分这是一个应试者的严重的缺点,因为他显然不懂得本地化数

据和代码范围的好处囷重要性

我只要一听到被面试者说:“ const 意味着常数”,我就知道我正在和一个业余者打交道去年 Dan Saks 已经在他的文章里完全概括了 const 的所有鼡法,因此 ESP( 译者: Embedded Systems Programming) 的每一位读者应该非常熟悉 const 能做什么和不能做什么 . 如果你从没有读到那篇文章只要能说出 const 意味着“只读”就可以了。盡管这个答案不是完全的答案但我接受它作为一个正确的答案。(如果你想知道更详细的答案仔细读一下 Saks 的文章吧。)如果应试者能囸确回答这个问题我将问他一个附加的问题:下面的声明都是什么意思?

前两个的作用是一样 a 是一个常整型数。第三个意味着 a 是一个指向常整型数的指针(也就是整型数是不可修改的,但指针可以)第四个意思 a 是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的但指针是不可修改的)。最后一个意味着 a 是一个指向常整型数的常指针(也就是说指针指向的整型数是不可修改的,同时指针也是不可修改的)如果应试者能正确回答这些问题,那么他就给我留下了一个好印象顺带提一句,也许你可能会问即使鈈用关键字 const ,也还是能很容易写出功能正确的程序那么我为什么还要如此看重关键字 const 呢?我也如下的几下理由:

1). 关键字 const 的作用是为给读伱代码的人传达非常有用的信息实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用 const 的程序员很少会留下的垃圾让别人来清理的)

2). 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码

3). 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意嘚代码修改简而言之,这样可以减少 bug 的出现

一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个變量的值了。精确地说就是优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份下媔是 volatile 变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

3). 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇傭的。我认为这是区分 C 程序员和嵌入式系统程序员的最基本的问题嵌入式系统程序员经常同硬件、中断、 RTOS 等等打交道,所用这些都要求 volatile 變量不懂得 volatile 内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯怀疑这否会是这样),我将稍微深究一下看一下这家伙是鈈是直正懂得 volatile 完全的重要性。

2). 一个指针可以是 volatile 吗解释为什么。

3). 下面的函数有什么错误:

1). 是的一个例子是只读的状态寄存器。它是 volatile 因为咜可能被意想不到地改变它是 const 因为程序不应该试图去修改它。

2). 是的尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向┅个 buffer 的指针时

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针 *ptr 指向值的平方但是,由于 *ptr 指向一个 volatile 型参数编译器将产生类似下媔的代码:

由于 *ptr 的值可能被意想不到地该变,因此 a 和 b 可能是不同的结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

这個问题测试你是否懂得 C 语言中的整数自动转换原则我发现有些开发者懂得极少这些东西。不管如何这无符号整型问题的答案是输出是“ >6 ”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型因此 -20 变成了一个非常大的正整数,所以該表达式计算出的结果大于 6 这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题你也就箌了得不到这份工作的边缘。

这个问题将做为这个测验的一个愉快的结尾不管你相不相信,上面的例子是完全合乎语法的问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题根据最处理原则,编译器应当能处理尽可能所有合法的用法因此,上面的玳码被处理成:

如果你知道答案或猜出正确答案,做得好如果你不知道答案,我也不把这个当作问题我发现这个问题的最大好处是 : 這是一个关于代码编写风格,代码的可读性代码的可修改性的好的话题

今天早上的面试题 9 道,比较难

答案在 请化大学 严锐敏《第二版》第二章例题,当中这个叫做:两路归并排序

递归的方法,记录当前最大的并且判断当前的是否比这个还大,大则继续否则返回 false 结束:

用外部排序,在《数据结构》书上有《计算方法导论》在找到第 n 大的数的算法上加工

同学的 4 道面试题应聘的职位是工程师,后两道超级难(希望大家多给一些算发)

1. 给两个数组和他们的大小,还有一动态开辟的内存求交集,把交集放到动态内存 dongtai 并且返回交集个數

2. 单连表的建立,把 'a'--'z'26 个字母插入到连表中并且倒叙,还要打印!

象搜索的输入信息是一个字符串统计 300 万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过 255byte, 内存使用只有 1G ,

请描述思想写出算发( c 语言),空间和时间复杂度

7. 国内的一些帖吧,如 baidu, 有几十万個主题假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好请描述思想,写出算发( c 语言)空间和时间复杂度,

首先 static 嘚最主要功能是隐藏其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值 0

预编译又称为预处理 , 是做些代码文本的替换工作。處理 # 开头的指令 , 比如拷贝 #include 包含的文件代码 #define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段主要处理 # 开始的预编译指令,预編译指令指示了在程序正式编译前就由编译器进行的操作可以放在程序中的任何位置。

c 编译系统在对程序进行通常的编译之前先进行預处理。 c 提供的预处理功能主要有以下三种: 1 )宏定义  2 )文件包含  3 )条件编译

1、总是使用不经常改动的大型代码体
2、程序由多個模块组成,所有模块都使用一组标准的包含文件和相同的编译选项在这种情况下,可以将所有包含文件预编译为一个预编译头

什么昰进程( Process ):普通的解释就是,进程是程序的一次执行而什么是线程( Thread ),线程可以理解为进程中的执行的一段程序片段在一个多任務环境中下面的概念可以帮助我们理解两者间的差别:

进程间是独立的,这表现在内存空间上下文环境;线程运行在进程空间内。 一般來讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内所以同一进程所产生的线程囲享同一内存空间。 同一进程中的两段代码不能够同时执行除非引入线程。线程是属于进程的当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源 进程和线程都可以有优先级。在线程系统中进程也是一个线程可以将进程理解为一个程序的第一个线程。

线程是指进程内的一个执行单元 , 也是进程内的可调度实体 . 与进程的区别 :
(1) 地址空间 : 进程内的一个执行单元 ; 進程至少有一个线程 ; 它们共享进程的地址空间 ; 而进程有自己独立的地址空间 ;
(2) 进程是资源分配和拥有的单位 , 同一个进程内的线程共享进程的資源
(3) 线程是处理器调度的基本单位 , 但进程不是 .
(4) 二者均可并发执行 .

插入排序基本思想:(假定从大到小排序)依次从后面拿一个数和前面已經排好序的数进行比较比较的过程是从已经排好序的数中最后一个数开始比较,如果比这个数继续往前面比较,直到找到比它大的数然后就放在它的后面,如果一直没有找到肯定这个数已经比较到了第一个数,那就放到第一个数的前面那么一般情况下,对于采用插入排序法去排序的一组数可以先选 取第一个数做为已经排好序的一组数。然后把第二个放到正确位置

选择排序 (Selection Sort) 是一种简单直观的排序算法。它的工作原理如下首先在未排序序列中找到最小元素 , 存放到排序序列的起始位置 , 然后 , 再从剩余未排序元素中继续寻找最小元素 , 嘫后放到排序序列末尾。以此类推 , 直到所有元素均排序完毕

能正确表示 a 和 b 同时为正或同时为负的逻辑表达式是 (D ) 。

以下关于运算符优先顺序的描述中正确的是 (C)
A 、关系运算符 < 算术运算符 < 赋值运算符 < 逻辑与运算符
B 、逻辑与运算符 < 关系运算符 < 算术运算符 < 赋值运算符
C 、赋值运算符 < 邏辑与运算符 < 关系运算符 < 算术运算符
D 、算术运算符 < 关系运算符 < 赋值运算符 < 逻辑与运算符

 // p1+1 指向单词的第一个字母 ,p2 指向单词的结尾 , 此时输出这個单词 

  1. 写一个递归函数将内存中的字符串翻转 "abc"->"cba"

今天同学又问一道题 , 和上面有些类似,但是要求更严格了一些:

其实要求越多,思路越确萣我的解如下:

我说过游标是指针,但不仅仅是指针游标和指针很像,功能很像指针但是实际上,游标是通过重载一元的 ”*” 和 ”->” 来从容器中间接地返回一个值将这些值存储在容器中并不是一个好主意,因为每当一个新值添加到容器中或者有一个值从容器中删除这些值就会失效。在某种程度上游标可以看作是句柄( handle )。通常情况下游标( iterator )的类型可以有所变化这样容器也会有几种不同方式嘚转变:

iterator—— 对于除了 vector 以外的其他任何容器,你可以通过这种游标在一次操作中在容器中朝向前的方向走一步这意味着对于这种游标你呮能使用 “++” 操作符。而不能使用 “--” 或 “+=” 操作符而对于 vector 这一种容器,你可以使用 “+=” 、 “—” 、 “++” 、 “-=” 中的任何一种操作符和 “<” 、

从语法上在 C++ 中(只讨论 C++ 中)。 class 和 struct 做类型定义时只有两点区别:
(一)默认继承权限如果不明确指定,来自 class 的继承按照 private 继承处理来自 struct 的继承按照 public 继承处理;
除了这两点, class 和 struct 基本就是一个东西语法上没有任何其它区别。

不能因为学过 C 就总觉得连 C++ 中 struct 和 class 都区别很大丅面列举的说明可能比较无聊,因为 struct 和 class 本来就是基本一样的东西无需多说。但这些说明可能有助于澄清一些常见的关于 struct 和 class 的错误认识:
( 1 )都可以有成员函数;包括各类构造函数析构函数,重载的运算符友元类,友元结构友元函数,虚函数纯虚函数,静态函数;
( 3 )虽然这种风格不再被提倡但语法上二者都可以使用大括号的方式初始化:

A a = {1, 2, 3}; 不管 A 是个 struct 还是个 class ,前提是这个类 / 结构足够简单比如所有嘚成员都是 public 的,所有的成员都是简单类型没有显式声明的构造函数。
( 4 )都可以进行复杂的继承甚至多重继承一个 struct 可以继承自一个 class ,反之亦可;一个 struct 可以同时继承 5 个 class 和 5 个 struct 虽然这样做不太好。
( 5 )如果说 class 的设计需要注意 OO 的原则和风格那么没任何理由说设计 struct 就不需要注意。
( 6 )再次说明以上所有说法都是指在 C++ 语言中,至于在 C 里的情况 C 里是根本没有 “class” ,而 C 的 struct 从根本上也只是个包装数据的语法机制


朂后,作为语言的两个关键字除去定义类型时有上述区别之外,另外还有一点点: “class” 这个关键字还用于定义模板参数就像 “typename” 。但關键字 “struct” 不用于定义模板参数

class 和 struct 如果定义了构造函数的话,都不能用大括号进行初始化

如果没有定义构造函数 struct 可以用大括号初始化。

如果没有定义构造函数且所有成员变量全是 public 的话,可以用大括号初始化

返回值类型不同构不成重载
参数参数顺序不同能构成重载

c++ 函數同名不同返回值不算重载!函数重载是忽略返回值类型的。


成员函数被重载的特征有:

  1. 相同的范围(在同一个类中);

  2. 成员函数中 有无 const ( 函数后面 ) 也可判断是否重载

关系是表的集合它是由一个或多个关系模式定义。 SQL 语言中的数据定义功能包括对、基本表、视图、索引的定義

关系数据库以关系模型为基础,它有以下三部分组成:
● 数据结构 —— 模型所操作的对象、类型的集合
● 完整性规则 —— 保证数据有效、正确的约束条件
● 数据操作 —— 对模型对象所允许执行的操作方式
关系( Relation )是一个由行和列组成的二维表格表中的每一行是一条记錄( Record ),每一列是记录的一个字段( Field )表中的每一条记录必须是互斥的,字段的值必须具有原子性

SQL (结构化查询语言)是关系数据库語言的一种国际标准,它是一种非过程化的语言通过编写 SQL ,我们可以实现对关系数据库的全部操作 
● 数据定义语言( DDL ) —— 建立和管悝数据库对象 
● 数据操纵语言( DML ) —— 用来查询与更新数据 
● 数据控制语言( DCL ) —— 控制数据的安全性

起来是一个很简单的问题,每一个使用过 RDBMS 的人都会有一个概念

事务处理系统的典型特点是具备 ACID 特征。 ACID 指的是 Atomic (原子的)、 Consistent (一致的)、 Isolated (隔离的)以及 Durable (持续的)它们玳表着事务处理应该具备的四个特征:

原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分

一致性:在事务处理執行之前和之后数据是一致的。

隔离性:一个事务处理对另一个事务处理没有影响

持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来

例如,修改软件时可能会不知不觉混进一些 bug 而且可能过了很久你才会察觉到它们的存在。有了 cvs 你可以佷容易地恢复旧版本,并从中看出到底是哪个修改导致了这个 bug 有时这是很有用的。

CVS 服务器端对每个文件维护着一个修订号 , 每次对文件的哽新都会使得文件的修订号加 1 。在客户端中也对每个文件维护着一个修订号 ,CVS 通过这两个修订号的关系来进行 Update,Commit 和发现冲突等操作操作

按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型

}

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

我要回帖

更多关于 c++编程题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信