没有合适的资源?快使用搜索试试~ 我知道了~
自己总结的一些C++经典面试题,希望对答家有帮助
资源详情
资源评论
资源推荐
C++经典面试题
1.是不是一个父类写了一个 virtual 函数,如果子类覆盖它的函数不加 virtual ,也能实现多态?
virtual 修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual
可加可不加。子类的空间里有父类的所有变量(static 除外)。同一个函数只存在一个实体
(inline 除外)。子类覆盖它的函数不加 virtual ,也能实现多态。在子类的空间里,有父类的私
有变量。私有变量不能直接访问。
--------------------------------------------------------------------------
2.输入一个字符串,将其逆序后输出。(使用 C++,不建议用伪码)
#include <iostream>
using namespace std;
void main()
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,'');
for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
cout<<a<<endl;
}
//第二种
string str;
cin>>str;
str.replace;
cout<<str;
--------------------------------------------------------------------------
3.请简单描述 Windows 内存管理的方法。
内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~
我先说个大概,希望能够抛砖引玉吧
当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运
行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了
虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在 load
入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做
计算程序片段在主存中的物理位置,以便 CPU 调度。
内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理
块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存
空间,把程 序片断 load 入主存,就算所需的程序片度只有几个字节也只能把这一块分配给
它。这样会造成很大的浪费,平均浪费了 50%的内存空间,但时易于管理。
页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种
方法的空间利用率要比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方
法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被
分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大
家都知道是 I/O 吧)。
段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干
段。好处就很明显,不用我多说了吧。
各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。
这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的
讲解
--------------------------------------------------------------------------
4.
#include "stdafx.h"
#define SQR(X) X*X
int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;
a /= SQR(k+m)/SQR(k+m);
printf("%d\n",a);
return 0;
}
这道题目的结果是什么啊?
define 只是定义而已,在编择时只是简单代换 X*X 而已,并不经过算术法则的
a /= (k+m)*(k+m)/(k+m)*(k+m);
=>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 不能修改。
(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);
--------------------------------------------------------------------------
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);
}
数组越界
--------------------------------------------------------------------------
11.下面代码有什么问题?
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}
==数组越界
==strcpy 拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0 的话 会一直复
制,直到遇到\0,上面的 123 都因此产生越界的情况
建议使用 strncpy 和 memcpy
--------------------------------------------------------------------------
12.下面代码有什么问题?
#define MAX_SRM 256
DSN get_SRM_no()
{
static int SRM_no; //是不是这里没赋初值?
int I;
for(I=0;I<MAX_SRM;I++,SRM_no++)
{
SRM_no %= MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(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
--------------------------------------------------------------------------
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);
}
剩余33页未读,继续阅读
ky000
- 粉丝: 16
- 资源: 66
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0