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

  • 相关阅读:
    洛谷 P1284 三角形牧场WD
    luogu P3817 小A的糖果
    P3374 【模板】树状数组 1
    线程与threading模块
    socketserver模块
    python 粘包问题及解决方法
    python 网络编程
    类的进阶四 反射和内置方法
    python hashlib模块 logging模块 subprocess模块
    类的进阶三
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/7644969.html
Copyright © 2011-2022 走看看