C++/C 程序员要掌握的问题集锦之二


------------------------------------------------------------------------------------------

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

------------------------------------------------------------------------------------------


发布了17 篇原创文章 · 获赞 4 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章