C++ Primer复习和学习笔记 第十三章 复制控制











#include "D:\C++WORK\main.h"
/*
class Employee//Employee定义【1】
{
	Employee():name("noname"),id(counter)
	{
		++counter;//使用counter原来的初始值,初始化,创建的新对象
				//然后对counter进行++
	}
	Employee(string nm):name(nm),id(counter)
	{
		++counter;
	}
	Employee(const Employee & other):name(other.name),id(counter)//不要这么写id(other.id)
	{
		++counter;
	}
	Employee& operator=(Employee & rhe)
	{
		name=rhe.name;
		return *this;
	}
private:
	string name;
	static int counter;//唯一的一个雇员标识符的初始数值。
	//int  counter;如果这里这么进行定义,编译器会显示重复定义    int  counter
	int   id;//唯一的一个雇员标识符,使用counter这个静态数值进行初始化
};
int  Employee::counter=1;
*/

class Employee//Employee定义【2】
{
public:
	Employee():name("noname")
	{
		SetId();
	}
	Employee(string  nm):name(nm)
	{
		SetId();
	}
	Employee(const Employee & other):name(other.name)
	{
		SetId();
	}
	Employee & operator=(const Employee & rhe)
	{
		this->name=rhe.name;
		return *this;
	}
	void get_id(const Employee & e)
	{
		 cout<<e.id<<endl;
	}
private:
	string name;
	static int counter;
	string  id;
private:
	void SetId()
	{
		id="Empl-";
		if (counter<10)
		{
			id=id+"000";
		}
		else if (counter<100)
		{
			id=id+"00";
		}
		else if(counter<10)
		{
			id=id+"0";
		}
		else 
		{
			cerr<<"非有效的ID"<<endl;
		}
	char buffer[5];
	_itoa(counter,buffer,10);
	id=id+buffer;
	++counter;
	}
};
int Employee::counter=1;


int main()
{
	Employee  e1("yang");
	e1.get_id(e1);
	return 0;
}

#include "D:\C++WORK\main.h"//智能指针的定义的示例程序

class U_Ptr//这个类是一个计数类。
{
private://我们不希望普通用户使用U_Ptr这个类,所有没有任何的public成员。
	friend class HasPtr;
	int * ip;
	size_t use;
	U_Ptr(int *p):ip(p),use(1) {	}
	~U_Ptr()	{	delete ip ;	}
};

class  HasPtr
{
private:
	U_Ptr *ptr;
	int val;
public:
	HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i) { }
	HasPtr(const HasPtr &orig):ptr(orig.ptr),val(orig.val)
	{
		++ptr->use;
	}
	HasPtr & operator=(const HasPtr &);
	~HasPtr(){ if(--ptr->use==0)  delete ptr;}
public:
	int * get_ptr()const { return ptr->ip;}
	int get_int() const { return val ;}
	void set_ptr(int * p){ ptr->ip=p;}
	void set_int(int i) {val =i;}
	int get_ptr_val()const { return *ptr->ip ;}
	void set_ptr_val(int i) {*ptr->ip=i;}
};
//因为赋值操作符比较复杂,所以不想用作inline函数
HasPtr & HasPtr::operator=(const HasPtr & rhs)
{//operator=作为成员函数只有一个形参
	++rhs.ptr->use;
	if (--ptr->use==0)
	{
		delete ptr;
	}
	ptr = rhs.ptr;
	val = rhs.val;
	return * this;
}
int  main()
{
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值