CC++语言程序设计笔试面试题24Word格式.docx
《CC++语言程序设计笔试面试题24Word格式.docx》由会员分享,可在线阅读,更多相关《CC++语言程序设计笔试面试题24Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
函数体内的指针变量并不会随着函数的消亡而自动释放
八、一个内存拷贝函数的实现体
void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)
assert((pvTo!
=NULL)&
&
(pvFrom!
=NULL));
byte*pbTo=(byte*)pvTo;
//防止地址被改变
byte*pbFrom=(byte*)pvFrom;
while(size-->
0)
pbTo++=pbForm++;
returnpvTo;
九、内存的分配方式
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题
1、静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。
2、栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
3、堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。
十、内存分配的注意事项
用new或malloc分配内存时,必须要对此指针赋初值。
用delete或free释放内存后,必须要将指针指向NULL
不能修改指向常量的指针数据
十一、内容复制与比较
//数组……
chara[]=”HelloWord!
”;
charb[10];
strcpy(b,a);
if(strcmp(a,b)==0)
{}
//指针……
char*p;
p=newchar[strlen(a)+1];
strcpy(p,a);
if(strcmp(p,a)==0)
十二、sizeof的问题
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节
chara[]=”HelloWorld!
”
char*p=a;
cout<
<
sizeof(a)<
end;
//12字节
sizeof(p)<
endl;
//4字节
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4
voidfun(chara[1000])
//输出4而不是1000
十三、关于指针
1、指针创建时必须被初始化
2、指针在free或delete后必须置为NULL
3、指针的长度都为4字节
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如
char*p=newchar[100];
strcpy(p,”HelloWorld”);
delete[]p;
//注意前面的[]号
p=NULL;
5、数组指针的内容不能超过数组指针的最大容易。
如:
char*p=newchar[5];
//报错目标容易不够大
十四、关于malloc/free和new/delete
malloc/free是C/C+的内存分配符,new/delete是C++的内存分配符。
注意:
malloc/free是库函数,new/delete是运算符
malloc/free不能执行构造函数与析构函数,而new/delete可以
new/delete不能在C上运行,所以malloc/free不能被淘汰
两者都必须要成对使用
C++中可以使用_set_new_hander函数来定义内存分配异常的处理
十五、C++的特性
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制
重载和内联:
即可用于全局函数,也可用于类的成员函数;
Const和Virtual:
只可用于类的成员函数;
重载:
在同一类中,函数名相同的函数。
由不同的参数决定调用那个函数。
函数可要不可要Virtual关键字。
和全
局函数同名的函数不叫重载。
如果在类中调用同名的全局函数,必须用全局引用符号:
:
引用。
覆盖是指派生类函数覆盖基类函数
函数名相同;
参数相同;
基类函数必须有Virtual关键字;
不同的范围(派生类和基类)。
隐藏是指派生类屏蔽了基类的同名函数相同
1、函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。
2、函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。
内联:
inline关键字必须与定义体放在一起,而不是单单放在声明中。
Const:
const是constant的缩写,“恒定不变”的意思。
被const修饰的东西都受到强制保护,可以预防意外的变
动,能提高程序的健壮性。
1、参数做输入用的指针型参数,加上const可防止被意外改动。
2、按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提
高效率。
数据类型为内部类型的就没必要做这件事情;
如:
将voidFunc(Aa)改为voidFunc(constA&
a)。
而voidfunc(inta)就没必要改成voidfunc(constint&
a);
3、给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。
如
:
函数constchar*GetString(void);
char*str=GetString()将会出错。
而constchar*str=GetString()将是
正确的。
4、Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。
如声明函数intGetCount
(void)const;
此函数体内就只能调用Const成员变量。
Virtual:
虚函数:
派生类可以覆盖掉的函数,纯虚函数:
只是个空函数,没有函数实现体;
十六、extern“C”有什么作用?
Extern“C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。
这是因为C++编译后
库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren“c”后,C++就能直接
调用C函数了。
Extern“C”主要使用正规DLL函数的引用和导出和在C++包含C函数或C头文件时使用。
使用时在前面加上
extern“c”关键字即可。
十七、构造函数与析构函数
派生类的构造函数应在初始化表里调用基类的构造函数;
派生类和基类的析构函数应加Virtual关键字。
不要小看构造函数和析构函数,其实编起来还是不容易。
iostream.h>
classBase
public:
virtual~Base(){cout<
"
~Base"
<
endl;
}
};
classDerived:
publicBase
virtual~Derived(){cout<
~Derived"
voidmain(void)
Base*pB=newDerived;
//upcast
deletepB;
输出结果为:
~Derived
~Base
如果析构函数不为虚,那么输出结果为
1.已知strcpy函数的原型是:
char*strcpy(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
不调用C++/C的字符串库函数,请编写函数strcpy
答案:
char*strcpy(char*strDest,constchar*strSrc)
if(strDest==NULL||strSrc==NULL)
returnNULL;
if(strDest==strSrc)
returnstrDest;
char*tempptr=strDest;
while((*strDest++=*strSrc++)!
='
’)
;
returntempptr;
2.已知类String的原型为:
classString
String(constchar*str=NULL);
//普通构造函数
String(constString&
other);
//拷贝构造函数
~String(void);
//析构函数
String&
operate=(constString&
//赋值函数
private:
char*m_data;
//用于保存字符串
请编写String的上述4个函数。
String:
String(constchar*str)
if(str==NULL)//strlen在参数为NULL时会抛异常才会有这步判断
m_data=newchar[1];
m_data[0]='
'
;
else
m_data=newchar[strlen(str)+1];
strcpy(m_data,str);
other)
m_data=newchar[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
String:
operator=(constString&
if(this==&
return*this;
delete[]m_data;
~String(void)
delete[]m_data;
3.简答
3.1头文件中的ifndef/define/endif干什么用?
答:
防止该头文件被重复引用。
3.2#include和#include“filename.h”有什么区别?
对于#include,编译器从标准库路径开始搜索filename.h
对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h
4.static有什么用途?
(请至少说明两种)
1.限制变量的作用域
2.设置变量的存储域
7.引用与指针有什么区别?
1)引用必须被初始化,指针不必。
2)引用初始化以后不能被改变,指针可以改变所指的对象。
2)不存在指向空值的引用,但是存在指向空值的指针。
8.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
9.全局变量和局部变量在内存中是否有区别?
如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈
10.什么是平衡二叉树?
左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1
11.堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源
12.什么函数不能声明为虚函数?
constructor
13.冒泡排序算法的时间复杂度是什么?
O(n^2)
14.写出floatx与“零值”比较的if语句。
if(x>
0.000001&
x<
-0.000001)
16.Internet采用哪种网络协议?
该协议的主要层次结构?
tcp/ip应用层/传输层/网络层/数据链路层/物理层
17.Internet物理地址和IP地址转换采用什么协议?
ARP(AddressResolutionProtocol)(地址解析協議)
18.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主
机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表,用取余操作做
3.不能做switch()的参数类型是:
switch的参数不能为实型。
華為
1、局部变量能否和全局变量重名?
能,局部会屏蔽全局。
要用全局变量,需要使用"
"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于
有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变
量,而那个局部变量的作用域就在那个循环体内
2、如何引用一个已经定义过的全局变量?
extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变
理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那
么在编译期间不会报错,而在连接期间报错
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?
为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
4、语句for(;
1;
)有什么问题?
它是什么意思?
和while
(1)相同。
5、do……while和while……do有什么区别?
前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容
#include<
stdio.h>
main()
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("
b,c,d:
%d,%d,%d"
,b,c,d);
return0;
}
10,12,120
1、static全局变量与普通的全局变量有什么区别?
static局部变量和普通局部变量有什么区别?
static函数与普
通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。
全局变量本身就是静态存储方式,静
态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用
域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态
全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中
引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改
变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),
内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要
使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
2、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
3、设有以下说明和定义:
typedefunion{longi;
intk[5];
charc;
}DATE;
structdata{intcat;
DATEcow;
doubledog;
}too;
DATEmax;
则语句printf("
%d"
sizeof(structdate)+sizeof(max));
的执行结果是:
___52____
DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小是20
data是一个struct,每个变量分开占用空间.依次为int4+DATE20+double8=32.
所以结果是20+32=52.
当然...在某些16位编辑器下,int可能是2字节,那么结果是int2+DATE10+double8=20
4、队列和栈有什么区别?
队列先进先出,栈后进先出
5、写出下列代码的输出内容
intinc(inta)
return(++a);
intmulti(int*a,int*b,int*c)
return(*c=*a**b);
typedefint(FUNC1)(intin);
typedefint(FUNC2)(int*,int*,int*);
voidshow(FUNC2fun,intarg1,int*arg2)
INCp=&
inc;
inttemp=p(arg1);
fun(&
temp,&
arg1,arg2);
%d\n"
*arg2);
inta;
show(multi,10,&
110
7、请找出下面代码中的所以错误
说明:
以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”