专题二经典问题解析_13

Posted 吕晓宁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专题二经典问题解析_13相关的知识,希望对你有一定的参考价值。

一。malloc与free 和 new与delete有什么区别

#include <cstdlib>
#include <iostream>

using namespace std;


class Test
{
    public:
        Test(int i)
        {
            cout <<"Test(int i)"<< endl;
            this->i = i;
        }
        Test()
        {
            cout <<"Test()" << endl;    
        }
        ~Test()
        {
            cout <<"~~Test" <<endl;    
        }
        int getI()
        {
            return i;    
        }
    private:
        int i;    
    
};

void func()
{
    int* p = reinterpret_cast<int*>(malloc(sizeof(int)));    
    int* q = new int(10);
    
    *p = 5;
  //  *q = 10;
    
    cout<< *p << " " << *q << endl;
    free(p);
    delete q;  
    
    Test* op = reinterpret_cast<Test*>(malloc(sizeof(Test)));
    Test* oq = new Test;
    
    cout << op->getI() <<" "<< oq->getI()<< endl;
    free(op);
    delete oq;
}

int main(int argc, char *argv[])
{
    func();
    
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

  1.malloc和free是库函数,以字节为单位申请堆内存

  2.new和delete是关键字,以类型为单位申请堆内存。

  3.malloc和free单纯的对内存进行申请和释放

  4.对于基本类型new关键字会对内存进行初始化

  5.对于类类型new和delete还负责构造函数和析构函数的调用

二。剥夺编译器对构造函数的调用尝试

  c++提供了explicit关键字用于阻止编译器对构造函数的调用

 explicit Test(int i)
        {
            cout <<"Test(int i)"<< endl;
            this->i = i;
        }

三。类的静态成员函数用来干嘛

  单例模式

#include <cstdlib>
#include <iostream>

using namespace std;

class Singleton
{
    private:
        static Singleton* cInstance;
        Singleton()
        {
            
        }
    public:
        static Singleton* GetInstance()
        {
            if(cInstance == NULL)
            {
                cInstance = new Singleton();
            }   
            
            return cInstance;
        }
        void print()
        {    
            cout << "I‘m  Singleton" << endl;  
        }
};
Singleton* Singleton::cInstance = NULL;
            
void func()
{
    Singleton* s = Singleton::GetInstance();
    s -> print();
}

int main(int argc, char *argv[])
{
    func();
    
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

四。无状态函数

  函数的调用结果只与实参值相关

  状态函数

  函数的调用结果不仅与实参值相关还与之前的函数调用有关

#include <cstdlib>
#include <iostream>

using namespace std;

int fib1(int i)
{
    int a1 = 0;
    int a2 = 1;
    int ret = a2;
    
    while( i > 1)
    {
        ret = a2 + a1;
        a1 = a2;
        a2 = ret;
        i--;
    }
    
    return ret;
}

int fib2()
{
    static int a1 = 0;
    static int a2 = 1;
    
    int ret = a2;
    int t = a2;
    
    a2 = a2 + a1;
    a1 = t;
    
    return ret;
}

class Fib
{
private:
    int a1;
    int a2;
public:
    Fib()
    {
        a1 = 0;
        a2 = 1;
    }
    
    int operator() ()
    {
        int ret = a2;
        int t = a2;
        
        a2 = a2 + a1;
        a1 = t;
        
        return ret;
    }
};

int main(int argc, char *argv[])
{
    cout<<"int fib1(int i)"<<endl;
    
    for(int i=1; i<=10; i++)
    {
        cout<<fib1(i)<<endl;
    }
    
    cout<<endl;
    
    cout<<"int fib2()"<<endl;
    
    for(int i=1; i<=10; i++)
    {
        cout<<fib2()<<endl;
    }
    
    cout<<endl;
    
    Fib fib;
    
    cout<<"Fib fib;"<<endl;
    
    for(int i=1; i<=10; i++)
    {
        cout<<fib()<<endl;
    }
    
    cout<<endl;
    
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

两中实现的问题:

  1.fib1是以无状态函数的方式实现的,求解数列的每一项都会做重复的循环,时间的复杂度为0(n)

  2.fib2是以状态函数的方式实现的,每调用一次就可以得到数列当前项的值,时间复杂度为0(1),但是无法从头再来

以上是关于专题二经典问题解析_13的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试备战篇:18个经典MySQL面试专题解析,干货分享

[YOLO专题-29]:对视频文件的小目标进行大小目标联合二次定位代码设计全过程解析

专题一经典问题解析-7

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

程序员面试备战篇:69个经典Spring面试专题解析(干货分享答案)

《Linux内核 核心知识全解析(完)》