• C++面试知识点总结


    预处理


    #宏定义求最大值  

    >#define MAX(x,y) ((x)>(y)?(x):(y))


    #const与define区别define 

    >在编译前执行,无数据类型,仅仅在编译前做替换const存在于程序中数据段,分配空间,有数据类型

    与C中#define的异同

    在C++中的用法
    1. 与C中#define相同的功能:字符替换
    2. 保护数据
    3. 结合引用传递,保护数据,提高效率

    #const在C++中的作用

    >修饰常量 : 编译器对其进行数据静态类型安全检查

    >修饰形参 :func( A const &a); 传入a的引用可以提高效率,但引用容易改变原值,所以加const保护

    >修饰函数返回值:当返回指针时给返回值加const , 则返回值不能被直接修改,并且赋值给 const修饰的变量

    >修饰成员函数:对于不需要修改成员变量的成员函数,都应该加const以避免误修改成员变量。


    #static有什么作用

    >在函数体,维持静态变量在函数调用过程不变

    >用来将变量或函数的作用于限制在本模块(文件)内

    >static函数在内存中只有一份

    >类中的static成员,所有对象共享。不属于具体对象,因此需要在类外面初始化,并且不能试用this指针


    #.static全局变量/局部变量/函数  与 普通全局变量/局部变量/函数 的区别

    a、全局变量:static作用域在当前文件(只能被初始化一次,防止在别的文件被引用)

    b、局部变量:static变量只初始化一次,下次调用使用上次的值

    c、函数:static函数在内存中只有一份,普通函数每调用一次都维持一份复制品。


    #.C++中的static静态成员

    a、静态成员变量目的:替代全局变量

    b、特征:类定义前就已经分配空间,因此必须在类外面初始化

    c、satic成员的引用:<类名>::<静态成员名>

    d、satic属于整个类而不是某个对象,因此没有this指针,因此他只能访问类的静态数据和静态函数


    static的两大特征 :
    1. 持久性:值不变
    2. 隐藏性:限定变量,函数,类成员的作用范围 
    3. 封装性:作为类成员时,其他类无法访问,本类的不同对象可以访问(可用作对象通信的方式)


    在C中的特性及用法
    -声明及存储:存放在全局区,而不是程序堆栈中,因此每次调用值都一样
    -仅在自己的作用范围可见(函数中,其他函数不可见;文件中,其他文件不可见),降低耦合度

    在C++中的用法

    #函数内部

    #局部静态对象

    #类中Static成员
            - 隐藏
            - 对象间数据共享(通信),数据持久
            - 默认初始化为0


    #求以下sizeof空间占用

    >char p[] = "Hello";                    // 6, p为数组,保存了 Hello+ ,  

    >char p[20] = "Hello";                   //20 ,p为数组,20个元素

    >char str[]="Hello"; char p = str;      // 4, p为指针

    >void func( char p[100] ){}             // 4, p为指向数组的指针    

    >void *p = malloc(100);                 // 4 , p为指向100字节堆内存的指针

    >sizeof 一个空类对象                    // 1,普通函数不占空间,但编译器会安插一个char成员,以便可以分配地址

    >sizeof一个含有虚函数的对象             // 4 ,虚函数指针(指向虚函数表)

    >sizeof虚继承自A同时虚继承自B            // 8 ,针对每个基类的继承会有不同的虚指针


    #.sizeof和strlen区别

    char str[] = "hellow" , sizeof(str)=strlen("hellow")+1 


    #.内联函数inline 与宏定义的区别

    >inline在编译时展开,宏在预编译时展开

    >inline函数可在编译时直接嵌入到目标代码,而宏只是做字符替换

    >inline函数会对数据类型,语法进行检测,宏不会

    >宏参数容易引起二义性

    >inline是为了提高调用效率

    >只有inline函数能访问类成员,宏定义则不行,起到封装性


    引用和指针


    #引用和指针区别

    >初始化,引用创建的同时必须初始化。

    >修改,引用初始化后不可在引用别的对象,但指针可以重新指向别的对象

    >不存在 NULL 的引用 ,因此不需要在使用引用前检查引用的合法性

    >基于以上两点,引用比指针安全


    内存

    #内存分配

    >malloc , 分配sie个字节空间,未初始化

    >calloc ,分配n块长度为size空间,已初始化

    >reallc ,拓展空间到size

    >new , delete ,在构造和析构函数中用来申请,释放内存


    面向对象

    #.构造和析构

    a.构造可重载,析构不能

    b.为什么基类的析构函数是虚函数:在析构时防止只析构基类而不析构派生类的状况发生





  • 相关阅读:
    微博个人中心效果
    微博弹性按钮
    ios9 3dtouch 博客
    去掉导航栏阴影
    模态全屏模式,实现半透明效果
    剪切图片
    修改push动画的方向
    数据库链接池终于搞对了,直接从100ms到3ms
    如何在Java代码中去掉烦人的“!=null”
    面试官:请讲下接口具体怎么优化!
  • 原文地址:https://www.cnblogs.com/fysola/p/4814835.html
Copyright © 2020-2023  润新知