专题二经典问题解析_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),但是无法从头再来

原文地址:https://www.cnblogs.com/lvxiaoning/p/7644969.html