zoukankan      html  css  js  c++  java
  • 引用及智能指针 常成员及静态成员介绍

    引用

    计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象内存磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。

    同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。

    每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。

    每次修改指针引用时(比如通过赋值语句),或者当引用超出范围时,编译器必须生成代码以更新引用的对象的引用计数。如果对象的引用计数变为零,那么运行时就可以立即收回这个块(并且减少被回收的块所引用的所有块的引用计数),或者将它放到迟延收集队列中。

    #include <iostream>
    
    #include <string>
    
    using namespace std;
    
    class Referenced
    
    {
    
    public:
    
    //初始化这个类,引用计数设为1,并且将p指向传入的地址
    
    Referenced(int * pi)
    
    {
    
    refCount=1;
    
    p=pi;
    
    }
    
     
    
    //引用计数加1
    
    int ref()
    
    {
    
    return ++refCount;
    
    }
    
     
    
    //引用计数减1
    
    int unref()
    
    {
    
    return --refCount;
    
    }
    
     
    
    //返回引用计数
    
    int count()
    
    {
    
    return refCount;
    
    }
    
     
    
    //析构函数,释放掉内存
    
    ~Referenced()
    
    {
    
    cout<<"delete referenced"<<endl;
    
    delete p;
    
    }
    
    private:
    
    int refCount;//引用计数,表示有多少个变量引用这块内存
    
    int * p;//真实的指针
    
    };
    
     
    
    //对指针进行管理的类,持有一个Referenced类的指针ptr,根据ptr中的
    
    //引用计数来判断是否调用delete来删除掉这个指针ptr
    
    class  Ref_ptr
    
    {
    
    public:
    
     
    
    //使用int*指针初始化ptr,注意必须要放在初始化列表中
    
    Ref_ptr(int * i):ptr(new Referenced(i))
    
    {
    
    }
    
     
    
    //拷贝构造函数,又有一个变量指向了这块内存
    
    Ref_ptr(const Ref_ptr & rhs)
    
    {
    
    ptr=rhs.ptr;//将右操作数的引用计数对象赋值给左操作数
    
    ptr->ref();//将它们的应用计数加1
    
    }
    
     
    
    //赋值操作符,右操作数的引用计数要减1,左操作数的引用计数要加1
    
    Ref_ptr & operator=(const Ref_ptr & rhs)
    
    {
    
    if(&rhs==this)
    
    return *this;
    
    if(ptr->unref()==0)//赋值操作符,首先将当前类的引用计数减1
    
    {
    
    cout<<"delete Ref_ptr"<<endl;
    
    delete ptr;
    
    }
    
    ptr=rhs.ptr;//将右操作数的引用计数赋值给当前对象
    
    ptr->ref();//引用计数加1
    
    return *this;
    
    }
    
     
    
    //析构函数,引用计数要减1,如果减为0,删除这块内存
    
    ~Ref_ptr()
    
    {
    
    if(ptr->unref()==0)
    
    {
    
    cout<<"delete Ref_ptr"<<endl;
    
    delete ptr;
    
    }
    
    }
    
    private:
    
    Referenced * ptr;
    
    };
    
     
    
    int main()
    
    {
    
    //Referenced rd=new int(4);
    
    Ref_ptr r=new int(4);
    
    Ref_ptr r1=new int(5);
    
    r=r1;
    
     
    
    getchar();
    
    return 0;
    
    }
    

      

    常成员函数:

    通常函数体用const修饰

    代表该函数不会修改对象数据的值

    常成员函数传入的this指针类型并非一般的type  *const  而是const  type  *const

    并且不能调用一般成员函数 可以调用常成员函数

    Mutable修饰成员永远不是const

    初始化列表

    通常使用在构造函数

    写法:

    构造函数():

    数据成员名1(初始化值),

    数据成员名2(初始化值),

    .....

    {

    }

    写法2:

    C11不支持

    Class 类名

    {

    Int a = 0;

    Char b = 0;

    }

    静态成员:

    静态数据成员所有对象公用该数据成员  一个对象内修改后 其他对象内的也修改

    静态成员函数

     可以定义在类内部,也可以定义在外边

     Static type 作用域()::函数名()

    {

    }

    静态成员函数不能访问一般成员  因为其并不传入this指针  如若访问 则需手动传入参数

    调用方式:函数名调用

    类名::函数名();

     

     

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    python 枚举enum
    python lambda 三元表达式
    python修改类属性
    python获取引用对象的个数
    python 返回实例对象个数
    python __del__() 清空对象
    python面向对象:继承
    python面向对象:多态
    Docker容器和K8s添加Health Check
    mkfs.xfs: /dev/vdb appears to contain a partition table (dos)
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13601604.html
Copyright © 2011-2022 走看看