zoukankan      html  css  js  c++  java
  • c++面试笔试集锦

    1. char *const p 是指针常量,通俗的解释:指针本身是一个常量 也就是不能改变该指针的指向性,可以改变指向的量的值

    const char *p 是常量指针,解释:指向常量的指针,指针指向的量是常量,不能改变指针所指向的量的值,可以改变指向性

    2.在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern "C"?

    C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern"C"来解决名字匹配问题。

    3.. 什么是RTTI?

    RTTI事指运行时类型识别(Run-time type identification)在只有一个指向基类的指针或引用时确定一个对象的准确类型。

    4.多态:是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;

    在程序编译时多态性体现在函数和运算符的重载上;

    虚函数:在基类中冠以关键字virtual的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

    纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

    从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

    抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

    5.有哪几种情况只能用intialization list(初始化列表)而不能用assignment(赋值)?

    对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表;初始化与赋值是不同的:赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化;初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值;常量不能被赋值,只能被初始化,所以必须在初始化列表中完成;C++的引用也一定要初始化,所以必须在初始化列表中完成。【 1) 引用必须被初始化,指针不必; 2) 引用初始化以后不能被改变,指针可以改变所指的对象; 3) 不存在指向空值的引用,但是存在指向空值的指针。】

    6.float与0比较语句

    float : const EXPRESSION EXP = 0.000001

    if ( a < EXP && a >-EXP)

    7.栈内存与文字常量区

    char str1[] = "abc";

    char str2[] = "abc";

    const char str3[] = "abc";

    const char str4[] = "abc";

    const char *str5 = "abc";

    const char *str6 = "abc";

    char *str7 = "abc";

    char *str8 = "abc";

    cout << ( str1 == str2 ) << endl;//0分别指向各自的栈内存

    cout << ( str3 == str4 ) << endl;//0分别指向各自的栈内存

    cout << ( str5 == str6 ) << endl;//1指向文字常量区地址相同

    cout << ( str7 == str8 ) << endl;//1指向文字常量区地址相同

    结果是:0 0 1 1

    解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。

    8.sizeof是编译时运算符,所以int id[sizeof(unsigned long)]是对的

    9.复杂声明

    void * ( * (*fp1)(int))[10];

    float (*(* fp2)(int,int,int))(int);

    int (* ( * fp3)())[10]();

    分别表示什么意思?
    【标准答案】                                                           

    1).void * ( * (*fp1)(int))[10];   fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*型指针。

    2).float (*(* fp2)(int,int,int))(int);   fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。

    3).int (* ( * fp3)())[10]();   fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。

    10. c++实现strcpy()函数

    char *strcpy(char *strDest, const char *strSrc)

    {

        assert((strDest!=NULL) && (strSrc !=NULL));    // 2分

        char *address = strDest;                                          // 2分

        while( (*strDest++ = * strSrc++) != '' )         // 2分

                  NULL ;

        return address ;                                                  // 2分

    }

    11. main 主函数执行完毕后,是否可能会再执行一段代码,

    可以用 _onexit 注册一个函数,它会在 main 之后执行 int fn1(void), fn2(void), fn3(void), fn4 (void);
    void main( void )
    {
    String str("zhanglin");
    _onexit( fn1 );
    _onexit( fn2 );
    _onexit( fn3 );
    _onexit( fn4 );
    printf( "This is executed first.n" );
    }

  • 相关阅读:
    【转】一个URL编码和解码的C++类
    ofstream的问题
    如何解决"应用程序无法启动,因为应用程序的并行配置不正确"问题(转载)
    最小生成树 prim & kruskal
    【2018百度之星资格赛】F 三原色图
    cout 按进制数出
    【2018百度之星资格赛】 A 问卷调查
    银河英雄传说
    读入读出挂!!
    关押罪犯
  • 原文地址:https://www.cnblogs.com/qbmiller/p/5225824.html
Copyright © 2011-2022 走看看