• 100道c++面试题(上)


    1. new, delete, malloc, free关系

    new/delete是c++的运算符,delete会调用对象的析构函数;

    malloc/free是c/c++的标准库函数,free只释放内存。

    2. delete和delete[]的区别

    delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。

    3. 对比c++和java

    4. 继承的优缺点

    5. c++有哪些性质(面向对象特点)

    封装、继承、多态

    6. 子类析构时要调用父类的析构函数吗?no

    7. 说说多态,虚函数,纯虚函数。

    c++的多态具体体现在运行和编译两方面:在运行时的多态通过继承和虚函数来体现;编译时的多态体现在函数和运算符的重载。

    抽象类不能用于直接创建对象实例,但仍可使用指向抽象类的指针支持运行时多态性。(没理解qaq)

    8. 求返回值(微软)

    int func(x)

    {

      int countx = 0;

      while(x)

      {

        countx ++;

        x = x&(x-1);

      }

      return countx;

    }

    答案:8

    思路:将x转化成2进制,看含有1的个数。

    9. 什么是“引用”?申明和使用“引用”要注意哪些问题?

    注意:引用不占存储单元。不能建立数组的引用。

    10. 将“引用”作为函数参数有哪些特点?

    11. 在什么时候需要使用“常引用”?

    既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变。

    const 类型标识符 &引用名=目标变量名

    注意:

    试图将const型对象转换为非const型是非法的;

    引用型参数应该在能被定义为const的情况下,尽量定义为const。

    12. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则

    格式:类型标识符 &函数名 (形参列表及类型说明) {//函数体}

    好处:在内存中不产生被返回值的副本;

    注意:参考Effective C++

    (1)不能返回局部变量的引用。

    (2)不能返回函数内部new分配的内存的引用。

    (3)可以返回类成员的引用,但最好是const

    (4)流操作符重载返回值申明为“引用”的作用:

    返回流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上针对不同的对象!

    返回指针,则不能连续使用<<操作符。

    因此,返回流对象的引用是唯一选择。

    例:#include<iostream.h>

    int &put(int n);

    int vals[10];

    int error=-1;

    void main()

    {

    put(0)=10;

    put(9)=20;

    cout<<vals[0];

    cout<<vals[9];

    }

    int &put(int n)

    {

    if (n>=0&&n<=9)return vals[n];

    else{cout<<"";return error;}

    }

    (5)在另外一些操作符中,却千万不能返回引用:+-*/四则运算符,只能返回对象。

    13. “引用”与多态的关系?

    引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

    14. “引用”与指针的区别?

    15. 什么时候需要“引用”?参考:http://develop.csai.cn/c/NO0000021.htm

    16. struct和union有何区别?

    (1)结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而

    结构的所有成员都存在(不同成员的存放地址不同)。

    (2)对于联合的不同成员赋值,将会对其它成员重写,原来成员的赋值就不存在了,而对于结构的不同成员赋值是互不影响的。

    17. 关于“联合”的代码的输出?

    a) # include <stdio.h>

    union

    {

    int i;

    char x[2];

    }a;

    void main()

    {

    a.x[0] = 10;

    a.x[1] = 1;

    printf("%d",a.i);

    }

    答案:266(低位低地址,高位高地址,内存占用情况是Ox010A

    b)

    main()

    {

    union{

        int i;

        struct{

        char first;

        char second;

        }half;

    }number;

    number.i=0x4241;

    printf("%c%cn",number.half.first,number.half.second);

    number.half.first='a';

    number.half.second='b';

    printf("%xn",number.i);

    getch();

    }

    答案:AB(0x41对应'A',是低位;Ox42对应'B',是高位)6261(number.i和number.half共用一块地址空间)

    18. 关联、聚合(Aggregation)以及组合(Composition)的区别?

    关联是两个类的一般性联系;

    聚合表示has-a关系,用空的菱形表示;

    组合表示contains-a关系,关联性强于聚合。组合类和被组合类有相同生命周期,组合类要对被组合类负责,用实心菱形表示。

    19. 说说面向对象的三个基本特征?

    封装、继承、多态(允许将子类类型的指针赋值给父类类型的指针)

    20. 重载(overload)和重写(override)的区别?早绑定和晚绑定。

    21. 多态的作用?

    (1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

    (2)接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

    22. Ado于Ado.net的异同?

    23. new delete于malloc free

    24. # define DOUBLE(x) x+x, i=5*DOUBLE(5); i是多少?30

    25. 有哪几种情况只能用initialiaztion list而不能用assignment?

    当类中含有const, reference成员变量;基类的构造函数都需要初始化列表。

    26. c++是不是类型安全的?不是,两个不同的指针类型可以强制转换。c#是类型安全的。

    27. main函数执行以前,还会执行什么代码?全局对象的构造函数

    28. 描述内存分配方式以及它们之间的区别?

    (1)从静态存储区域分配。(2)在栈上创建。(3)从堆上分配,亦称动态内存分配。程序员自己用malloc/free,new/delete

    29. struct和class的区别?struct的成员默认是公有的,class的成员默认是私有的。

    30. 当一个类A中没有任何成员变量与成员函数,这时sizeof(A)的值是多少?非零。

    31. 在8086汇编下,逻辑地址和物理地址是怎么转换的?(Intel)

    通用寄存器给出的地址,是段内偏移地址,相应段内寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

    32. 比较c++的4种类型转换方式?

    33. 分别写出bool,int,float,指针变量a与“零”比较的语句。

    bool:  if(!a) or if(a)

    int:  if(a==0)

    float:  const EXPRESSION EXP = 0.000001

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

    pointer: if(a!=NULL) or if(a=NULL)

    34. 请说出const和define想比有何优点?

    35. 简述指针和数组的区别。

    ......注意,当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

    36. 求两个数中最大的一个,不允许用"if", "?", "switch"或者其它判断语句。

    ((a+b)+abs(a-b))/2

    37. 如何打印出当前源文件的文件名以及源文件的当前行号?

    cout<<__FILE__;cout<<__LINE__;//系统预定义宏。

    38. 如何判断一段程序是由C编译的还是C++编译的?

    #ifdef __cplusplus

    cout<<"c++";

    #else

    cout<<"c";

    #endif

    39. 运算符优先级:赋值运算符<逻辑与运算符<关系运算符<算术运算符

    40. 纯虚函数怎么实现的?在编译原理上讲下?

  • 相关阅读:
    OPENCV(3) —— 对XML和YAML文件实现I/O 操作
    OPENCV(2) —— Basic Structures(二)
    OPENCV(2) —— Basic Structures(一)
    OPENCV(1)
    转:计算机视觉相关领域代码集
    ScSPM
    ScSPM & LLC
    Spatial Pyramid Matching
    Convolution & Pooling exercise
    Restricted Boltzmann Machines
  • 原文地址:https://www.cnblogs.com/jdbc2nju/p/9420763.html
Copyright © 2020-2023  润新知