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

  • 相关阅读:
    SQL临时表加分页操作
    JS 操作Url参数
    C#字符串根据特定字符串分割
    windows下python读写excel
    怎样才是更好的自己 多好才算更好的未来
    IndentationError: unindent does not match any outer indentation level
    LinAlgError: Array must not contain infs or NaNs
    c#操作xml
    sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)(转)
    利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/7644969.html
Copyright © 2020-2023  润新知