栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > C++面试题库

网上流传的C++面试题

网上流传的C++面试题

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
virtual修饰符会被隐形继承的。
private 也被集成,只事派生类没有访问权限而已
virtual可加可不加
子类的空间里有父类的所有变量(static除外)
同一个函数只存在一个实体(inline除外)
子类覆盖它的函数不加virtual ,也能实现多态。
在子类的空间里,有父类的私有变量。私有变量不能直接访问。

————————————————————————–
2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
#include
using namespace std;

void main()
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,’n’);
for(i=0,j=strlen(a)-1;istr;
str.replace;
cout<
#include
#include
using namespace std;
int main()
{
string str;
getline(cin,str);
reverse(str.begin(), str.end());
cout<<"str Reversed:"<a /= (k+m)*1*(k+m);
=>a = a/9;
=>a = 1;
————————————————————————–
5.
const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别;

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
(1)const char *p
一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:
const char *p;
char c1=’a’;
char c2=’b’;
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(2)char const *p
(3)char * const p
这两个好象是一样的,此时*p可以修改,而p不能修改。
错!const char *p应该与char const *p是一样的才对!此时*p不可修改,而p是可以修改的!
(4)const char * const p
这种是地址及指向对象都不能修改。
————————————————————————–
6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=
————————————————————————–
7.下面的代码有什么问题?
void DoSomeThing(…)
{
char* p;

p = malloc(1024); // 分配1K的空间
if (NULL == p)
return;

p = realloc(p, 2048); // 空间不够,重新分配到2K
if (NULL == p)
return;

}
A:
p = malloc(1024); 应该写成: p = (char *) malloc(1024);
没有释放p的空间,造成内存泄漏。

————————————————————————–
8.下面的代码有什么问题?并请给出正确的写法。
void DoSomeThing(char* p)
{
char str[16];
int n;
assert(NULL != p);
sscanf(p, “%s%d”, str, n);
if (0 == strcmp(str, “something”))
{

}
}
A:
sscanf(p, “%s%d”, str, n); 这句该写成: sscanf(p, “%s%d”, str, &n);
由于str有限,如果输入的字符串过大,会引发堆栈溢出!!!
————————————————————————–
9.下面代码有什么错误?
Void test1()
{
char string[10];
char *str1=”0123456789″;
strcpy(string, str1);
}
数组越界
————————————————————————–
10.下面代码有什么问题?
Void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++) { str1[i] ='a'; } strcpy(string, str1); } 数组越界(以’/0’为拷贝界限)--------------------------------------------------------------------------11.下面代码有什么问题?Void test3(char* str1) { char string[10]; if(strlen(str1)<=10) { strcpy(string, str1); } } ==数组越界==strcpy拷贝的结束标志是查找字符串中的 因此如果字符串中没有遇到的话 会一直复制,直到遇到,上面的123都因此产生越界的情况 建议使用 strncpy 和 memcpy--------------------------------------------------------------------------12.下面代码有什么问题?#define MAX_SRM 256 DSN get_SRM_no() { static int SRM_no; //是不是这里没赋初值? int I; for(I=0;I=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
}
系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入…
————————————————————————–
13.写出运行结果:
{// test1
char str[] = “world”; cout << sizeof(str) << ": "; char *p = str; cout << sizeof(p) << ": "; char i = 10; cout << sizeof(i) << ": "; void *pp = malloc(10); cout << sizeof(p) << endl;}6:4:1:4出自林锐博士的《高质量C++编程》,面试时见过N多次了,比较经典的题目。--------------------------------------------------------------------------14.写出运行结果:{// test2 union V { struct X { unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; } x; unsigned char c; } v; v.c = 100; printf("%d", v.x.s3);}目前这个问题网上流行的答案有三个:1, 3, 4,在本人的机器上结果为3(VC7)struct X的位占用顺序为:低2位,中3位,高3位,也就是说,union V的实际内容为0110 0100s3占用高3位,取值011,十进制为3。再补充一下,占用不满8位时,会截取低N位,如截取s2的低3位放入X的中间3位中。--------------------------------------------------------------------------15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数A1:16位的系统下,int i = 65536;cout << i; // 输出0;int i = 65535;cout << i; // 输出-1;32位的系统下,int i = 65536;cout << i; // 输出65536;int i = 65535;cout << i; // 输出65535;A2:int a = ~0;if( a>65536 )
{
cout<<"32 bit"<
void main()
{
int i=60;
int j=50;
i=i+j;
j=i-j;
i=i-j;
printf(“i=%dn”,i);
printf(“j=%dn”,j);
}
方法二:
i^=j;
j^=i;
i^=j;
方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)
方法三好强的说 =_=||,一上来就b=a了,b不就丢掉了吗?反正我是没找回来,呵呵
————————————————————————–
18.有关位域的面试题(为什么输出的是一个奇怪的字符)
a.t = ‘b’;效果相当于 a.t= ‘b’ & 0xf;
‘b’ –> 01100010
‘b’ & 0xf –>>00000010
所以输出Ascii码为2的特殊字符

char t:4;就是4bit的字符变量,同样
unsigned short i:8;就是8bit的无符号短整形变量
尚未验证
————————————————————————–
19.int i=10, j=10, k=3; k*=i+j; k最后的值是?
60
————————————————————————–
20.进程间通信的方式有?
进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE等
————————————————————————–
21.
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?(不考虑边界对齐)
7
struct CELL // Declare CELL bit field
{
unsigned character : 8; // 00000000 ????????
unsigned foreground : 3; // 00000??? 00000000
unsigned intensity : 1; // 0000?000 00000000
unsigned background : 3; // 0???0000 00000000
unsigned blink : 1; // ?0000000 00000000
} screen[25][80]; // Array of bit fields
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8;
unsigned txcolor: 4;
unsigned bgcolor: 3;
unsigned blink: 1;
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;
上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
和上面的那个差不多
————————————————————————–
22.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正
int add_n(int n)
{
static int i=100;
i+=n;
return i;
}
答:
因为static使得i的值会保留上次的值。
去掉static就可了
————————————————————————–
23.下面的代码有什么问题?
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};
答:
会引起无限递归
由于A对象析构会调用~A(), 但是在delete p时又会调用~A();由于p!=NULL,会引起无限递归。
————————————————————————–
24.
union a {
int a_int1;
double a_double;
int a_int2;
};
typedef struct
{
a a1;
char y;
} b;
class c
{
double c_double;
b b1;
a a2;
};
输出cout<j++) && (i++ == j)) i+=j;
答:
i = 5
未验证,本人认为这种题目没有任何实际意义!
————————————————————————–
26.
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;
*(array + i) = ?
答:
4
————————————————————————–
27.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;} virtual void func2(){cout << "fun2 in class B" << endl;}} A, A中的func1和B中的func2都是虚函数.B, A中的func1和B中的func2都不是虚函数.C, A中的func2是虚函数.,B中的func1不是虚函数.D, A中的func2不是虚函数,B中的func1是虚函数.答:A--------------------------------------------------------------------------28.数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有"human resource"部门,employee结构如下:employee_id, employee_name, depart_id,depart_name,wage答:select depart_name, avg(wage)from employeewhere depart_name <> ‘human resource’
group by depart_name
order by depart_name
————————————————————————–
29.
给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等
答:
select top 1 num
from Test
order by num desc
————————————————————————–
30.
输出下面程序结果。
#include
class A
{
public:
virtual void print(void)
{
cout<<"A::print()"<print();
pb->print();
pc->print();

print(a);
print(b);
print(c);
}
A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()
A::print()
C++是根据内存中的具体类对象模型来判断使用哪个虚函数的,记住这个就行了!
————————————————————————–
31.
试编写函数判断计算机的字节存储顺序是升序(little endian)还是降序(bigendian)
答:
bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;
return (*pucData == 0x22);
}
————————————————————————–
32.简述Critical Section和Mutex的不同点
答:
对几种同步对象的总结
1.Critical Section
A.速度快
B.不能用于不同进程
C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)
2.Mutex
A.速度慢
B.可用于不同进程
C.不能进行资源统计
3.Semaphore
A.速度慢
B.可用于不同进程
C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)
4.Event
A.速度慢
B.可用于不同进程
C.可进行资源统计
有关于临界区和互斥对象的内容可参见《Windows 程序设计》及《Windows 核心编程》等。
————————————————————————–
33.一个数据库中有两个表:
一张表为Customer,含字段ID,Name;
一张表为Order,含字段ID,CustomerID(连向Customer中ID的外键),Revenue;
写出求每个Customer的Revenue总和的SQL语句。
建表
create table customer
(
ID int primary key,Name char(10)
)
go
create table [order]
(
ID int primary key,CustomerID int foreign key references customer(id) , Revenue float
)
go
–查询
select Customer.ID, sum( isnull([Order].Revenue,0) )
from customer full join [order]
on( [order].customerid=customer.id )
group by customer.id
晕,不是说C++的面试题吗?怎么这么多数据库的啊?这个没看 =_=||
————————————————————————–
34.请指出下列程序中的错误并且修改
void GetMemory(char *p){
p=(char *)malloc(100);
}
void Test(void){
char *str=NULL;
GetMemory=(str);
strcpy(str,”hello world”);
printf(str);
}
A:错误–参数的值改变后,不会传回
GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。
strcpy(str, “hello world”);将使程序崩溃。
修改如下:
char *GetMemory(){
char *p=(char *)malloc(100);
return p;
}
void Test(void){
char *str=NULL; //内存泄露
str=GetMemory(){
strcpy(str,”hello world”);
printf(str);
}
方法二:void GetMemory2(char **p)变为二级指针.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
《高质量C++编程》
————————————————————————–
35.程序改错
class mml
{
private:
static unsigned int x;
public:
mml(){ x++; }
mml(static unsigned int &) {x++;}
~mml{x–;}
pulic:
virtual mon() {} = 0;
static unsigned int mmc(){return x;}
……

};
class nnl:public mml
{
private:
static unsigned int y;
public:
nnl(){ x++; }
nnl(static unsigned int &) {x++;}
~nnl{x–;}
public:
virtual mon() {};
static unsigned int nnc(){return y;}
……
};
代码片断:
mml* pp = new nnl;
……….
delete pp;

A:
基类的析构函数应该为虚函数
virtual ~mml{x–;}
————————————————————————–
36.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
答:
101个先取出2堆,
33,33
第一次称,如果不相等,说明有一堆重或轻
那么把重的那堆拿下来,再放另外35个中的33
如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)
第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比
下面就不用说了
方法二:
第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。
如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在
B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。
————————————————————————–
37.static变量和static 函数各有什么特点?
答:
static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;
static函数:在编译单元内可见;
————————————————————————–
38.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ;
答:
void fun( int a )
{
printf( “%d”, a%10 );
a /= 10;
if( a <=0 )return; fun( a );}--------------------------------------------------------------------------39.写出程序结果:void Func(char str[100]){ printf("%dn", sizeof(str));}答:4分析:指针长度--------------------------------------------------------------------------40.int id[sizeof(unsigned long)]; 这个对吗?为什么??答:对这个 sizeof是编译时运算符,编译时就确定了可以看成和机器有关的常量。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/265749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号