Q:是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
A:
virtual修饰符会被隐形继承的。virtual可加可不加,子类的空间里面有父类的所有变量(static除外),同一个函数只存在一个实体(inline除外),子类覆盖它的函数不加virtual,也能实现多态。
------------------------------------------------------------------------------------------
Q:输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
A:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char * src = "hello world";
int len = 0;
char * dest = new char;
while( *src++ != NULL )
{
cout<<*(src-1);
}
src -= 2;
cout<<endl;
while( *src-- != NULL )
{
*dest = *(src+1);
cout<<*dest;
*dest++;
}
cout<<endl;
return 0;
}
------------------------------------------------------------------------------------------
Q:写出程序结果:
void Func(char str[100])
{
printf("%d/n", sizeof(str));
}
A: 4
分析: 指针长度
------------------------------------------------------------------------------------------
Q:请简单描述Windows内存管理的方法?
A:windows内存管理主要处理两件事情:
一.把那些不常用的程序片段放入虚拟内存,当需要用到的时候load入主存中。
二.计算程序片段在主存的物理位置,以便cpu调用。
内存管理分为块式管理,页式管理,段式管理,段页式管理。
块式管理:把主存分为一大块,一大块的,当所需的程序片段不在主存时,就分配一块主存空间,把程序片段load入主存,就算所需的程序片段只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但是易于管理。
页式管理:把主存分成一页一页的 ,每一页的空间要比一块一块的空间小得很多,显然这种方法空间的利用率要比块式管理高效很多。
段式管理:把主存分成一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页面管理高很多,但是也存在一个缺点。一个程序片段可能会被分成十几段,这样会浪费很多时间在计算每一段物理地址上。
段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分成若干段,这样做不但使得空间的利用率高效,而且在访问物理地址上速度也会提升。
------------------------------------------------------------------------------------------
Q:用C写一个输入的整数,倒着输出整数的函数,要求用递归方法?
A:
#include <iostream>
#include <string>
using namespace std;
void fun(int a)
{
cout<<a%10;
a /= 10;
if(a <= 0)
return;
fun( a );
}
int main()
{
int input_data;
cout<<"请输入一个整数: ";
cin>>input_data;
fun(input_data);
return 0;
}
------------------------------------------------------------------------------------------
Q:以下程序输出的结果是什么?
#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;
}
A: 1
解释:
SQR(k+m)/SQR(k+m)
= k+m*k+m / k+m*k+m
= 2+1*2+1/2+1*2+1
= 2+2+0+2+1
= 7
a = a / 7 = 1
------------------------------------------------------------------------------------------
Q:const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
(4)const char * const p
说明上面四种描述的区别;
A:
(1)const char *p 是指向字符型常量的指针,该指针指向的值不能变,但指针可以指向其他变量。
(2)char const *p 是指向字符型常量的指针,该指针指向的值不能变,但指针可以指向其他变量。
(3)char * const p 是指向字符型的常量指针,该指针指向的值可以改变,但是指针不能指向其他变量。
(4)const char * const p 是指向字符型常量的常量指针,该指针指向的值不能改变,指针不能指向其他变量。
可以这样记:
const 在*之"前"表示内容不变
const 在*之"后"表示指针不变
------------------------------------------------------------------------------------------
Q:下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
A:第二种
如果少了一个"=",编译器会检测出错误,如果是第一种,编译器不会提示错误。
------------------------------------------------------------------------------------------
Q:下面的代码有什么问题?
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);
char * p = NULL; 要初始化。
“栈内存”的指针在return结束的时候自动消亡,但是并不意味着释放了P的内存空间,容易造成内存泄漏。
------------------------------------------------------------------------------------------
Q:请填写BOOL,float,指针变量与“零值”比较的if语句。
提示:这里“零值”可以是0,0.0,false或者“空指针”。例如int变量n与“零值”比较的if语句为:
if( n == 0 )
if( n != 0 )
以此类推。
请写出BOOL flag与“零值”比较的if语句:
请写出float x与“零值”比较的if语句:
请写出char *p与“零值”比较的if语句:
A:
请写出BOOL flag与“零值”比较的if语句:
if( flag )
if( !flag )
如下写法均属不良风格,不得分
if( flag == true )
if( flag == 1 )
if( flag == false )
if( flag == 0 )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请写出float x与“零值”比较的if语句:
const float epsinon = 0.00001
if(( x >= -epsinon )&&( x <= epsinon ))
如下是错误的写法,不得分
if( x == 0.0 )
if( x != 0.0 )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请写出char *p与“零值”比较的if语句:
if( p == NULL )
if( p != NULL )
如下写法均属不良风格,不得分
if( p == 0 )
if( p != 0 )
if(p)
if(!)
------------------------------------------------------------------------------------------
Q:以下为windows NT下的32位C++程序,请计算sizeof的值。
char str[] = "Hello";
char *p = str;
int n =10;
请计算
sizeof(str) =
sizeof(p) =
sizeof(n) =
void Func(char str[100])
{
请计算
sizeof(str) =
}
void *p = malloc(100);
请计算
sizeof(p) =
A:
char str[] = "Hello";
char *p = str;
int n =10;
请计算
sizeof(str) = 6;
sizeof(p) = 4;
sizeof(n) = 4;
void Func(char str[100])
{
请计算
sizeof(str) = 4;
}
void *p = malloc(100);
请计算
sizeof(p) = 4;
------------------------------------------------------------------------------------------
Q:头文件中的ifdef/define/endif干什么用?
A:预编译指令,防止该头文件被重复引用。
------------------------------------------------------------------------------------------
Q:#include <filename.h> 和 #include "filename.h" 有什么区别?
A:
对于#include <filename.h>,编译器从标准库路径开始搜索filename.h。
对于#include "filename.h" ,编译器从用户的工作路径开始搜索filename.h。
------------------------------------------------------------------------------------------
Q:const有什么用途?(请至少说明两种)
A:
1.可以定义const常量。
2.const可以修饰函数的参数,返回值,甚至函数的定义体。被const修饰的东西都受到强烈的保护,可以预防意外的变动,能提高程序的健壮性。
------------------------------------------------------------------------------------------
Q:在C++程序中调用被C编译器编译后的函数,为什么要加extern"C"声明?
A:
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。
假设某个函数函数的原型为:void foo(int x, int y);
该函数在C编译器编译后的库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern"C"来解决名字匹配问题。
------------------------------------------------------------------------------------------
Q:写出运行结果:
int main()
{
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;
}
A:
char str[] = "world"; cout << sizeof(str) << ": "; 6
char *p = str; cout << sizeof(p) << ": "; 4
char i = 10; cout << sizeof(i) << ": "; 1
void *pp = malloc(10); cout << sizeof(p) << endl; 4