zoukankan      html  css  js  c++  java
  • 智能指针的问题(现阶段不懂呢)

    #include<iostream>  
    using namespace std;
    
    // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针  
    // 这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员  
    // 将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员  
    class U_Ptr
    {
    	friend class HasPtr;
    	int *ip;
    	size_t use;
    	U_Ptr(int *p) : ip(p), use(1)
    	{
    		cout << "U_ptr constructor called !" << endl;
    	}
    	~U_Ptr()
    	{
    		delete ip;
    		cout << "U_ptr distructor called !" << endl;
    	}
    };
    
    class HasPtr
    {
    public:
    	// 构造函数:p是指向已经动态创建的int对象指针  
    	HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i)
    	{
    		cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;
    	}
    
    	// 赋值构造函数:赋值成员并将使用计数加1  
    	HasPtr(const HasPtr& orig) : ptr(orig.ptr), val(orig.val)
    	{
    		++ptr->use;
    		cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;
    	}
    
    	// 赋值操作符   HasPtr& HasPtr::operator = (const HasPtr &rhs)
    	HasPtr& operator=(const HasPtr&rhs);
    
    	// 析构函数:如果计数为0,则删除U_Ptr对象  
    	~HasPtr()
    	{
    		cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;
    		if (--ptr->use == 0)
    			delete ptr;
    	}
    
    	// 获取数据成员  
    	int *get_ptr() const
    	{
    		return ptr->ip;
    	}
    	int get_int() const
    	{
    		return val;
    	}
    
    	// 修改数据成员  
    	void set_ptr(int *p) const
    	{
    		ptr->ip = p;
    	}
    	void set_int(int i)
    	{
    		val = i;
    	}
    
    	// 返回或修改基础int对象  
    	int get_ptr_val() const
    	{
    		return *ptr->ip;
    	}
    	void set_ptr_val(int i)
    	{
    		*(ptr->ip) = i;
    	}
    private:
    	U_Ptr *ptr;   //指向使用计数类U_Ptr  
    	int val;
    };
    HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值  
    {
    	// 增加右操作数中的使用计数  
    	++rhs.ptr->use;//这里相当于++(rhs.ptr->use)
    	// 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象  
    	if (--ptr->use == 0)
    		delete ptr;
    	this->ptr = rhs.ptr;   // 复制U_Ptr指针  
    	this->val = rhs.val;   // 复制int成员  
    	return *this;
    }
    
    int main(void)
    {
    	int *pi = new int(42);
    	HasPtr *hpa = new HasPtr(pi, 100);    // 构造函数  
    	HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数  
    	HasPtr *hpc = new HasPtr(*hpb);     // 拷贝构造函数  
    	HasPtr hpd = *hpa;     // 拷贝构造函数  
    
    	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    	hpc->set_ptr_val(10000);
    	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    	hpd.set_ptr_val(10);
    	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
    	delete hpa;
    	delete hpb;
    	delete hpc;
    	cout << hpd.get_ptr_val() << endl;
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    【洛谷6620】[省选联考 2020 A 卷] 组合数问题(下降幂)
    【AtCoder】AtCoder Grand Contest 033 解题报告
    【AtCoder】AtCoder Grand Contest 034 解题报告
    【洛谷5445】[APIO2019] 路灯(树套树)
    【LOJ6059】「2017 山东一轮集训 Day1」Sum(倍增优化数位DP+NTT)
    【LOJ6159】「美团 CodeM 初赛 Round A」最长树链(树的直径)
    重新入门的Polya定理
    【洛谷6105】[Ynoi2010] y-fast trie(set)
    【BZOJ4480】 [JSOI2013] 快乐的jyy(回文自动机裸题)
    【LOJ6172】Samjia 和大树(树形DP+猜结论)
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6704920.html
Copyright © 2011-2022 走看看