zoukankan      html  css  js  c++  java
  • C plus plus day3

    栈、堆、类模板、函数模板、static

    Stack:是存在于某作用域的一块内存空间。列如当你调用函数,函数本身会形成一个stack用来放置它所接收的参数,以及返回地址。

                 在函数本体内声明的任何变量,其所使用的内存都来自stack

    Heap:是指由操作系统提供的一块全局内存空间,程序可动态分配从其中获得若干区块。

    用new取得的在作用域外也可以使用,不用时需要释放内存空间

    一般的函数只能在作用域内使用,离开作用域就死亡了。自动调用析构函数

    {
        complex c1(1,2)
    }

     static对象  其生命在作用域结束之后仍然存在 直到整个程序结束。

    {
        static complex c1(1,2)
    }

     全局对象  在任何{}外的 生命在整个程序结束后才消失

    堆对象的生命期  不加delete会造成内存泄露

    {
    complex* p = new complex;得到p指针
    ...
    delete p;
    }

    new :先分配内存 再转型  调用构造函数

    delete:先调用析构函数  在释放内存

    inline
    String::String(const char* cstr =0)
    {
        if(cstr){// 分配足够空间  还有一个结束符号  字符串要有最后一个结束符
            m_data = new char[strlen(cstr)+1];//array new 需要搭配array delete  数组形式分配内存空间
            strcpy(m_data,cstr);
        }
        else{   //未指定初值   new分配一个字符内存  结束符号
            m_data = new char[1];
            *m_data = '';
        }
    }
    
    inline
    String::String()
    {
        delete[] m_data; //动态分配内存 使用完就要把内存释放 防止内存泄露
    }

    array new 一定要搭配 array delete

        String *p = new String[3];
        ...
        delete[] p;

    创建三个数组对象  如果只是 delete p 就会只唤起一次 析构函数

    class Account
    {
    public:
        static double m_rate;
        static void set_rate(const double& x){m_rate = x;}
    };
    double Account::m_rate =8.0;
    //静态变量建议在class外 赋初值
    
                                                       调用static函数的方式有2:
    1、通过对象直接调用
    2、通过classname 调用 int main() { Account::set_rate(5.0); Account a; a.set_rate(7.0) }

    类模板

    template<typename T>
    class complex
    {
    public:
        complex(T r=0,T i=0):re(r),im(i){}
        T real() const {return re;}
        T imag() const {return im;}
        ~complex();
    private:
        T re,im;
    
    };
    {
        complex<double> c1(2.5,1.5);  调用时可以根据不同类型来调
        complex<int> c2(2,6);
    }

    函数模板

    class stone
    {
    public:
        stone(int w,int h,int we):_w(w),_h(h),_weight(we){}
        bool operator<(const stone& rhs) const
        {return _weight <rhs._weight;}
        ~stone();
    private:
        int _w,_h, _weight;
        
    };
    
    
    template <class T>
    inline
    const T& min(const T& a,const T& b)
    {      
        return b<a? b: a;
    }
    stone r1(2,3),r2(3,3),r3;   看stone里面有没有 ‘<’操作符
    r3 = min(r1,r2);   引用推导   调用stone::operator<

    c++中的算法都是template function.

  • 相关阅读:
    nohup npm start &启动之后关闭终端程序没有后台运行
    C++标准库之string返回值研究
    Apache Thrift的C++多线程编程定式
    实战C++对象模型之成员函数调用
    std::string的拷贝赋值研究
    REdis AOF文件结构分析
    使用Linux自带日志滚动工具logrotate滚动redis日志示例
    源码分析MySQL mysql_real_query函数
    源码解读Linux的limits.conf文件
    C++中的return和exit区别
  • 原文地址:https://www.cnblogs.com/suizhixxie/p/10459973.html
Copyright © 2011-2022 走看看