您的位置:首页 > 编程语言 > C语言/C++

C++面试题 个人整理

2013-01-06 16:40 239 查看
以下内容为本人在网上摘抄整理

1.static有什么用途?(请至少说明两种)

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


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



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


2.引用与指针有什么区别?

1)
引用必须被初始化,指针不必。



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



3) 不存在指向空值的引用,但是存在指向空值的指针。


3.描述实时系统的基本特性

在特定时间内完成特定的任务,实时性与可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

全局变量储存在静态数据库,局部变量在堆栈。

5.什么是平衡二叉树?


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


6.堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源。

7.什么函数不能声明为虚函数?

constructor函数不能声明为虚函数。

8.冒泡排序算法的时间复杂度是什么?


时间复杂度是O(n^2)。


9.写出float x
与“零值”比较的if语句。



if(x>0.000001&&x<-0.000001)


10.Internet采用哪种网络协议?该协议的主要层次结构?

Tcp/Ip协议


主要层次结构为:应用层/传输层/网络层/数据链路层/物理层。


11.Internet物理地址和IP地址转换采用什么协议?

ARP (Address Resolution Protocol)(地址解析協議)

12.IP地址的编码分为哪俩部分?


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


13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。

循环链表,用取余操作做

14.不能做switch()的参数类型是:


switch的参数不能为实型。


1. 以下三条输出语句分别输出什么?[C易]

char str1[] = "abc";

char str2[] = "abc";

const char str3[] = "abc";

const char str4[] = "abc";

const char* str5 = "abc";

const char* str6 = "abc";

cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?

cout << boolalpha << ( str3==str4 ) << endl; //
输出什么?

cout << boolalpha << ( str5==str6 ) << endl; //
输出什么?

答:

false, false, true

字符串”abc”在常量区里只有一份。三组比较的都是地址:5,6为指向常量字符串的指针,所指向的地址相同。而前4个是将字符串的值复制

给栈上数组1~4,比较的是数组的首地址,各数组的地址不相同。

2. 非C++内建型别 A
和 B,在哪几种情况下B能隐式转化为A?[C++中等]

答:

a. class B : public A { ……} // B公有继承自A,可以是间接继承的

b. class B { operator A( ); } // B实现了隐式转化为A的转化

c. class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数

d. A& operator= ( const A& ); //
赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

3. 以下代码中的两个sizeof用法有问题吗?[C易]

void UpperCase( char str[] ) // 将 str
中的小写字母转换成大写字母

{

for( size_t i=0; i

if( 'a'<=str[i] && str[i]<='z' )

str[i] -= ('a'-'A' );

}

char str[] = "aBcDe";

cout << "str字符长度为: " << sizeof(str)/sizeof(str[0])<< endl;

UpperCase( str );

cout << str << endl;

答:

函数里传数组时,数组会退化为指针,长度为地址长度4。后一个为5个字母加上字符串结束符‘/0’.

4. 以下代码有什么问题?[C难]

void char2Hex( char c ) // 将字符以16进制表示

{

char ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);

char cl = c%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);

cout << ch << cl << ' ';

}

char str[] = "I love 中国";

for( size_t i=0; i

char2Hex( str[i] );

cout << endl;

答:

用了char而非unsignedchar,汉字可以出现80以上的编码,即负值,导致解析错误

5. 以下代码有什么问题?[C++易]

struct Test

{

Test( int ) {}

Test() {}

void fun() {}

};

void main( void )

{

Test a(1);

a.fun();

Test b();

b.fun();

}

答:

Test b才是栈上对象使用默认构造函数的方法。而文中的被编译器解析为了函数申明。

6. 以下代码有什么问题?[C++易]

cout << (true?1:"1") << endl;

答:

1,“1”无法转换成同一类型。”1”为字符串
‘1’和’/0’。三元运算符?:返回值需同一类型。

7. 以下代码能够编译通过吗,为什么?[C++易]

unsigned int const size1 = 2;

char str1[ size1 ];

unsigned int temp = 0;

cin >> temp;

unsigned int const size2 = temp;

char str2[ size2 ];

答:

不能,temp不是常量。因此栈上数组无法确定大小

8. 以下代码中的输出语句输出0吗,为什么?[C++易]

struct CLS

{

int m_i;

CLS( int I ) : m_i(i) {}

CLS()

{

CLS(0);

}

};

CLS obj;

cout << obj.m_i << endl;

答:

输出值未定义。显示的调用构造函数实际上是创建一个该类型的新匿名对象,而不是初始化想要得那个对象。对象本身的m_i没有初始化。

9. C++中的空类,默认产生哪些类成员函数?[C++易]

答:

class Empty

{

public:

Empty(); // 缺省构造函数

Empty( const Empty& ); // 拷贝构造函数

~Empty(); // 析构函数

Empty& operator=( const Empty& ); //
赋值运算符

Empty* operator&(); // 取址运算符

const Empty* operator&() const; //
取址运算符 const

};

如果上述函数没有被使用到,也不会产生。

10. 以下两条输出语句分别输出什么?[C++难]

float a = 1.0f;

cout << (int)a << endl;

cout << (int&)a << endl;

cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?

Float b = 0.0f;

cout << (int)b << endl;

cout << (int&)b << endl;

cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?

答:

false,true

cout << (int&)b << endl;,这句话应该是直接使用int类型来输出b的内存地址里的数据。0.0f时float类型的内存段里的32bit都为0。

cout << (int)&b << endl是把b的地址转化为int值输出。

float的结构为

1个符号位,8个阶码位和23个尾数位

double为

1个符号位,11个阶码位,52个尾数位

浮点数的表示形式类似于数学上的科学计数法,不过浮点数是二进制的。舍入法是向偶数舍入(指尾数二进制上的)

浮点数的详细内容参见 IEEE754
或《深入理解计算机系统》第二版,2.4节

11. 以下反向遍历array数组的方法有什么错误?[STL易]

vector array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 3 );

for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组

{

cout << array[i] << endl;

}

答:

array声明方法应该是vector<int>array.

循环里有问题,size_type为无符号整数,即永远大于等于0,循环永不结束。

12. 以下代码有什么问题?[STL易]

typedef vector IntArray;

IntArray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

if( 2 == *itor ) array.erase( itor );

}

答:

声明方法应该是vector<int>

迭代器失效。删除一个元素后,后面的元素前进移动,即第二个2没有

本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。

笔试时间90分钟。请考生认真答题,切勿轻视。

一、请填写BOOL, float, 指针变量与“零值”比较的 if
语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如
int 变量 n 与“零值”比较的 if
语句为:

if ( n == 0 )

if ( n != 0 )

以此类推。

请写出BOOL flag 与“零值”比较的 if
语句:

请写出float x 与“零值”比较的 if
语句:

请写出char *p 与“零值”比较的 if
语句:

答:

if ( flag )

if ( !flag )




如下写法均属不良风格,不得分。

If (flag == TRUE)

if (flag == 1 )

if (flag == FALSE)

if (flag == 0)

请写出float x 与“零值”比较的 if
语句。(4分)

标准答案示例:

const float EPSINON = 0.00001f;

if ((x >= - EPSINON) && (x <= EPSINON)

不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

如下是错误的写法,不得分。

If (x == 0.0)

if (x != 0.0)


以上是标准答案,但浮点数的0是有严格定义的。正0.0,全比特位为0,负0.0,符号位为1,其他都是0。感觉题目应该去比较1.0之类的



请写出char *p 与“零值”比较的 if
语句。(3分)

标准答案:

if (p == NULL) // 网上给出的标准答案是这么写的但个人觉得应该把NULL放在前面

if (p != NULL) // 这样如果漏了个=(NULL
= p),编译器就能报错。




如下写法均属不良风格,不得分。

If (p == 0)

if (p != 0)

if (p)

if (!p)

二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分)

char str[] = “Hello” ;

char *p = str ;

int n = 10;

请计算

sizeof (str ) = 6 // 5个字母加结束符’/0’

sizeof ( p ) = 4

sizeof ( n ) = 4

void Func ( char str[100])

{

请计算

sizeof( str ) = 4 // 函数参数,数组退化成指针

}

void *p = malloc( 100 );

请计算

sizeof ( p ) = 4

三、简答题(25分)

1、头文件中的ifndef/define/endif
干什么用?

答:

防止头文件被重复引用。

2、#include<>
和 #include “filename.h” 有什么区别?

答:

<>用于标准头文件,””用于自定义头文件。两者的搜索路径不同

3、const有什么用途?(请至少说明两种)

答:

常数,常数参数,常量成员函数。

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加extern “C”声明?

答:

已编译的C代码与已编译的C++代码格式不同,所以要告诉编译器某些函数是用C编写的,这样链接器就能适当地使用这些函数了。C++与C得符号规则不一样。

5、请简述以下两个for循环的优缺点

// 第一个

for (i=0; i++;)

{

if (condition)

DoSomething();

else

DoOtherthing();

}

// 第二个

if (condition)

{

for (i=0; i++;)

DoSomething();

}

else

{

for (i=0; i++;)

DoOtherthing();

}

答:

优点:每次循环时都会判断下条件,然后执行相应事件

缺点:每次都要进行判断,消耗资源

优点:只判断一次,然后循环执行相应事件

缺点:没法改变条件

这题也不知是谁想出来的?两种不同的需求,没什么可比性。

四、有关内存的思考题(20分)

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

请问运行Test函数会有什么样的结果?

答:

函数时按值传递了一个指针变量。函数里改变的是指针副本p的值,使其指向所申请的内存,而str仍然指向NULL。之后试图对NULL地址做写入操作,内存访问违规

char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

请问运行Test函数会有什么样的结果?

答:

野指针,结果未定义。函数中的字符串是栈上的局部变量,函数退出后,局部变量也就销毁了。

void GetMemory(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test函数会有什么样的结果?

答:

程序完全正确,子函数利用参数(地址)成功的为主函数申请了动态内存

void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL)

{

strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:

野指针,结果未定义。动态内存被free掉之后,但指针仍指向之前的地址,成为野指针。

五、编写strcpy函数(10分)

已知strcpy函数的原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char
* 类型的返回值?


答:

返回char*是为了方便代码链式写法。比如:

strcpy(str1,strcpy(str2,str3));

六、编写类String的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

class String

{

public:

String(const char *str = NULL) //
普通构造函数

{

if(NULL == str)

m_data = NULL;

else

{

m_data = new char[strlen(str) + 1];

strcpy(m_dara, str);

m_data[strlen(str)] = ‘/0’;

}

};

String(const String&other) //
拷贝构造函数

{

if(NULL == other.m_data)

m_data = NULL;

else

{

m_data = new char[strlen(other.m_data) + 1];

strcpy(m_dara, other.m_data);

m_data[strlen(other.m_data)] = ‘/0’;

}

};

~ String(void) //
析构函数

{

delete[] m_data;

m_data = NULL;

};

String & operate =(constString &other) //
赋值函数

{

if(&other == this)

return *this;

else

{

delete m_data;

if(NULL == other.m_data)

m_data = NULL;

else

{

m_data = new char[strlen(other.m_data) + 1];

strcpy(m_dara, other.m_data);

m_data[strlen(other.m_data)] = ‘/0’;

}

}

};

private:

char *m_data; // 用于保存字符串

};


华为的C\C++面试题

Q1:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?

1、OSI每层功能及特点

a 物理层为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。此外,该层中还具有确定连接设备的电气特性和物理特性等功能。

b 数据链路层负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传送以帧为单位的数据。为做到这一点,在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。

c 网络层为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。

d 传输层传输层是高低层之间衔接的接口层。数据传输的单位是报文,当报文较长时将它分割成若干分组,然后交给网络层进行传输。传输层是计算机网络协议分层中的最关键一层,该层以上各层将不再管理信息传输问题。

e 会话层该层对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。例如,确定是双工还是半双工工作。

f 表示层该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。

g 应用层该层直接面向用户,是OSI中的最高层。它的主要任务是为用户提供应用的接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计算机通过网络交互访问的虚拟终端功能等.

2、TCP/IP

a 网络接口层 这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。

b 网际网层(IP层)  该层包括以下协议:IP(网际协议)、ICMP(Internet
Control Message Protocol,因特网控制报文协议)、ARP(Address Resolution Protocol,地址解析协议)、RARP(Reverse
Address Resolution Protocol,反向地址解析协议)。该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。IP协议在TCP/IP协议组中处于核心地位。

c 传输层  该层提供TCP(传输控制协议)和UDP(User
Datagram Protocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。

d 应用层  TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议,其中包括:Telnet、SMTP、DNS等。此外,在应用层中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。

3、OSI参考模型和TCP/IP参考模型的区别:

a OSI模型有7层,TCP/IP只有4层;

b OSI先于协议出现,因此不会偏向于任何一组特定的协议,通用性更强,但有些功能不知该放哪一层上,因此不得不加入一些子层;TCP/IP后于协议出现,仅是将已有协议的一个描述,因此两者配合的非常好;但他不适合其他的协议栈,不容易描述其他非TCP/IP的网络;

c OSI中网络层同时支持无连接和面向连接的通信,但在传输层上只支持面向连接的通信;TCP/IP中网络层只支持无连接通信,传输层同时支持两种通信;

d 在技术发生变化时,OSI模型比TCP/IP模型中的协议更容易被替换。

Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?

解:与IP协议配套使用的还有三个协议:

ARP-地址解析协议

RARP-逆地址解析协议

ICMP-因特网控制报文协议ICMP

IP协议-网际协议

IP地址、IP包头

Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?

将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继(relay)系统。根据中继系统所在的层次,可以有以下五种中继系统:

1.物理层(即常说的第一层、层L1)中继系统,即转发器(repeater)。

2.数据链路层(即第二层,层L2),即网桥或桥接器(bridge)。

3.网络层(第三层,层L3)中继系统,即路由器(router)。

4.网桥和路由器的混合物桥路器(brouter)兼有网桥和路由器的功能。

5.在网络层以上的中继系统,即网关(gateway).

当中继系统是转发器时,一般不称之为网络互联,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。高层网关由于比较复杂,目前使用得较少。因此一般讨论网络互连时都是指用交换机和路由器进行互联的网络。

本文主要阐述交换机和路由器及其区别。

第二层交换机和路由器的区别:

传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。因特网的路由选择协议:内部网关协议IGP和外部网关协议EGP

第三层交换机和路由器的区别:

在第三层交换技术出现之前,几乎没有必要将路由功能器件和路由器区别开来,他们完全是相同的:提供路由功能正在路由器的工作,然而,现在第三层交换机完全能够执行传统路由器的大多数功能。

综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于WAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。他们只是从一条线路上接受输入分组,然后向另一条线路转发。这两条线路可能分属于不同的网络,并采用不同协议。相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能,因此得以广播应用。

Q4:请问C++的类和C里面的struct有什么区别?

Q5:请讲一讲析构函数和虚函数的用法和作用?

Q6:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

Q7:一些寄存器的题目,我忘记了具体实什么题目,主要好像是寻址和内存管理等一些知识,不记得了。

一般建议参加华为的研发面试的同学先要准备一下相关的知识,软件的主要

是看看C和数据结构方面的,硬件模电,数电和微机原理

两道c面试题

1、一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,
在些链表中删除学生年龄等于age的学生信息。


程序代码

#I nclude "stdio.h"

#I nclude "conio.h"

struct stu{

char name[20];

char sex;

int no;

int age;

struct stu * next;

}*linklist;

struct stu *creatlist(int n)

{

int I;

//h为头结点,p为前一结点,s为当前结点

struct stu *h,*p,*s;

h =(struct stu *)malloc(sizeof(struct stu));

h->next = NULL;

p=h;

for(i=0;i<n;i++)

{

s = (struct stu *)malloc(sizeof(structstu));

p->next = s;

printf("Please input theinformation of the student: name sex no age \n");

scanf("%s %c %d%d",s->name,&s->sex,&s->no,&s->age);

s->next = NULL;

p = s;

}

printf("Create successful!");

return(h);

}

void deletelist(struct stu*s,int a)

{

struct stu *p;

while(s->age!=a)

{

p = s;

s = s->next;

}

if(s==NULL)

printf("The record is not exist.");

else

{

p->next = s->next;

printf("Delete successful!");

}

}

void display(struct stu *s)

{

s = s->next;

while(s!=NULL)

{

printf("%s %c %d%d\n",s->name,s->sex,s->no,s->age);

s= s->next;

}

}

int main()

{

struct stu *s;

int n,age;

printf("Please input thelength of seqlist:\n");

scanf("%d",&n);

s = creatlist(n);

display(s);

printf("Please input theage:\n");

scanf("%d",&age);

deletelist(s,age);

display(s);

return 0;

}

2、实现一个函数,把一个字符串中的字符从小写转为大写。

程序代码

#I nclude "stdio.h"

#I nclude "conio.h"

void uppers(char *s,char *us)

{

for(;*s!='\0';s++,us++)

{

if(*s>='a'&&*s<='z')

*us = *s-32;

else

*us = *s;

}

*us ='\0';

}

int main()

{

char *s,*us;

char ss[20];

printf("Please input astring:\n");

scanf("%s",ss);

s = ss;

uppers(s,us);

printf("The resultis:\n%s\n",us);

getch();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: