• C++笔试面试准备(自用整理)(一)


    转载:https://blog.csdn.net/ljh0302/article/details/81098764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161494999616780262523772%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161494999616780262523772&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-81098764.first_rank_v2_pc_rank_v29_10&utm_term=C%2B%2B%E7%AC%94%E8%AF%95%E9%9D%A2%E8%AF%95%E9%A2%98

    1、C++中指针与引用的区别

    1)指针是一个新的变量,存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;

    引用只是一个别名,还是变量本身,对引用的任何操作就是对变量本身进行操作,以达到修改变量的目的

    2)引用只有一级,而指针可以有多级

    3)指针传参的时候,还是值传递,指针本身的值不可以修改,需要通过解引用才能对指向的对象进行操作。

    引用传参的时候,传进来的就是变量本身,因此变量可以被修改。

    2、结构体(struct):

    将不同类型的数据组合成一个整体,sizeof(struct)是内存对齐后所有成员长度的总和。

    3、内存对齐:(转自:http://www.pinlue.com/article/2021/01/2100/0011500966600.html)

      int short long char cahr* float double
    32位 4 2 4 1 4 4 8
    64位 4 2 8 1 8 4 8

     

    例1:(假设指定对齐字节为8,那么n = min(8,4) = 4)

    class node{    int i; //放在位置0,位置区间[0~3]    char c; //1 < n, 那么放置起始位置应该是1的倍数,即4,位置区间为[4]    short s; //2 < n,那么放置起始位置应该是2的倍数,即6,位置区间为[6~7]}

    成员共占据[0~7]8个字节,刚好是4的倍数,因此大小是8

    例2(假设指定对齐字节是2,则n = min(2,4) = 2) 

    class node{    char c; //放在位置0,位置区间[0]    int i; //4 > n, 那么放置起始位置应该是2的倍数,即2,位置区间为[2~5]    short s; //2 = n,那么放置起始位置应该是2的倍数,即6,位置区间为[6~7]}

    此时成员共占用[0~7]8个字节,刚好是4的倍数,因此大小是8

    4、#define和const的区别

    1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态区域

    2)处理阶段不同,#define定义的宏变量在预处理时进行替换,可能有多个拷贝,const所定义的变量在编译时确定其值,只有一个拷贝。

    3)#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址

    4)#define可以定义简单的函数,const不可以定义函数

    5、重载:同一类中,函数名相同,参数和返回值不同(相同范围(同一个类中)、函数名字相同、参数不同、virtual关键字可有可无)

    覆盖:派生类覆盖基类的虚函数,实现接口的重用(不同范围(基类和派生类)、函数名字相同、参数相同、基类中必须有virtual关键字(必须是虚函数))

    重写:派生类屏蔽了其同名的基类函数(不同范围(基类和派生类)、函数名字相同、参数不同或者参数相同且无virtual关键字)

    6、new、delete、malloc、free之间的关系

    new/delete,malloc/free都是动态分配内存的方式

    1)malloc对开辟的空间大小严格指定,而new只需要对象名

    2)new为对象分配空间时,调用对象的构造函数,delete调用对象的析构函数

    既然有了malloc/free,C++中为什么还需要new/delete呢?

    因为malloc/free是库函数而不是运算符,不能把执行构造函数和析构函数的功能强加于malloc/free.

    7.STL库:(转载:https://blog.csdn.net/qq_41431457/article/details/88898925)

    STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。

    vector:是支持随机访问的迭代器

     

     

     

     

     

     

     

     

     vector的动态增加大小的时候,并不是在原有的空间上持续新的空间(无法保证原空间的后面还有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,并释放原空间。在VS下是1.5倍扩容,在GCC下是2倍扩容。

    #include<iostream>
    #include<vector>
    using namespace std;
    
    //iterator模式:提供一种方法,使之能依次访问容器内的各个元素,而又不暴露该聚合物内部的表述方式。 
    void print(vector<int>&v){
        for(vector<int>::iterator i=v.begin();i!=v.end();i++){
            cout<<*i<<" ";
        }
        cout<<endl;
    }
    //四种定义方法 
    void test01()
    {
        vector<int>v1;
        for(int i=0;i<10;i++){
            v1.push_back(i);
        }
        print(v1);
        
        vector<int>v2(v1.begin(),v1.end());
        print(v2);
        
        vector<int>v3(10,100);
        print(v3);
        
        vector<int>v4(v3);
        print(v4);
        
        //赋值 opertor= 
        vector<int>v5;
        v5=v1;
        print(v5);
        
        //assign赋值
        vector <int>v6;
        v6.assign(v1.begin(),v1.end());
        print(v6);
        
        vector <int>v7;
        v7.assign(10,1);//10个1
        print(v7); 
        
        //插入,第一个参数是迭代器
        v7.insert(v7.begin(),1000) ;
        print(v7);
        
        v7.insert(v7.begin(),3,11111000) ;
        print(v7);
        
         
    }
    
    int main()
    {
        test01();
        
        return 0;
    }

    8、const

    const修饰类的成员变量,表示常量不可能被修改

    const修饰类的成员函数,表示该函数不会修改类中的数据成员,不会调用其他非const的成员函数

    static:

    12、关键字static的作用

    1)函数体内: static 修饰的局部变量作用范围为该函数体,不同于auto变量,其内存只被分配一次,因此其值在下次调用的时候维持了上次的值

    2)模块内:static修饰全局变量或全局函数,可以被模块内的所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内

    3)类中:修饰成员变量,表示该变量属于整个类所有,对类的所有对象只有一份拷贝

    4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的static成员变量

    9.堆和栈的区别

    堆heap 低址-高址 内存手动释放 效率低 函数的参数值、局部变量
    栈stack  高-低 自动 效率高 new

    10、C++中的内存管理

    在C++中,内存被分成五个区:栈、堆、代码区、全局/静态存储区、常量区

    代码区:

    栈:存放函数的参数和局部变量,编译器自动分配和释放

    堆:new关键字动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收

    全局/静态存储区:存放全局变量和静态变量

    常量区:存放常量,不允许被修改

    11、delete与 delete []的区别:

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

    delete和new对应,delete []和new []对应

    注意:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用

    12、JAVA与C++的区别:

    1)JAVA完全面对对象,C++兼容了C,不彻底;

    2)指针:JAVA编程者无法使用指针,更安全

    3)多重继承:c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。 

    4)数据类型及类:JAVA所有函数和变量都必须是类的一部分,C++可以是全局。

    5)JAVA不支持重载

    。。。。。。

    13、

  • 相关阅读:
    可能是全网最详细的express--middleware
    带你学Node系列之express-CRUD
    简单聊聊ES6-Promise和Async
    Node学习图文教程之express重写留言本案例
    Node.js学习(第四章:初见express)
    彻底弄懂ES6中的Map和Set
    全网最easy的better-scroll实现上拉加载和下拉刷新
    Node中require第三方模块的规则
    canvas实现酷炫气泡效果
    Node.js实现用户评论社区(体验前后端开发的乐趣)
  • 原文地址:https://www.cnblogs.com/yananhome/p/14490642.html
走看看 - 开发者的网上家园