zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C# DES加密和解密
    SQL设计技巧优化
    MS15-034漏洞技术研究
    Vustudy靶场环境快速搭建
    FastJson<=1.2.47漏洞复现
    多台电脑共享一套鼠键--Mouse Without Borders
    {Java初级系列四}---继承、接口和抽象类
    {Java初级系列三}---面向对象和类
    {Java初级系列二}---Java类基础知识
    {Java初阶系列一}---Java基本简介
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410151.html
Copyright © 2011-2022 走看看