您的位置:首页 > 其它

浅拷贝(在进行其中一个对象的运算时开辟新的空间)

2015-06-07 02:14 417 查看


如图变换,且对于指向同一空间的String进行计数

代码如下:

#include <iostream>
using namespace std;

class String;                                             //提前声明

class String_rep                                          //定义类String_rep
{
friend class String;                                  //友元
public:
String_rep(const char *str=NULL):use_count(0)         //构造
{
if(str == NULL)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String_rep(const String_rep &r);                      //拷贝构造
String_rep& operator=(const String_rep &r);           //赋值函数
~String_rep()
{
delete []m_data;
}
public:
void increment()                                       //计数器加一
{
use_count++;
}
void decrement()                                       //若计数器为零则释放
{
if(--use_count == 0)
{
delete this;
}
}
int get_use_count()const                               //计数器
{
return use_count;
}
void Show()const                                       //显示
{
cout<<m_data<<endl;
}

private:                                                   //私有成员
char *m_data;
long use_count;
};

class String                                               //定义类String
{
public:
String(const char *str=NULL):rep(new String_rep(str))  //构造
{
rep->increment();
}
String(const String &s):rep(s.rep)                     //拷贝构造
{
rep->increment();
}
String& operator=(const String &s)                     //赋值函数
{
if(this != &s)                                     //若为同一字符串
{
rep->decrement();
rep = s.rep;
rep->increment();
}
return *this;                                      //反之
}
~String()                                              //析构
{
rep->decrement();
}
public:
void Show()const                                       //显示
{
rep->Show();
}
void to_upper()                                         //变为大写
{
String_rep *new_rep = new  String_rep(rep->m_data); //新的指针
rep->decrement();                                   //原计数器减一
rep = new_rep;                                      //指向新的空间
rep->increment();                                   //现计数器加一
char *pch = rep->m_data;                            //确定指向
while(*pch != '\0')                                 //变成大写
{
*pch -= 32;
pch++;
}
}
private:
String_rep *rep;//句柄
};

void main()
{
String s1("abcd");
String s2 = s1;
String s3;
s3 = s2;
s1.to_upper();//将s1的小写变大写
s1.Show();   //ABCD
s2.Show();   //abcd
s3.Show();   //abcd
}


如果代码有不足的地方希望大家指出~谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: