C++——浅拷贝深拷贝
Posted 一棵灬胡杨树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++——浅拷贝深拷贝相关的知识,希望对你有一定的参考价值。
这篇blog只是做一个简单的记录,让自己看到这个程序时有一个简单的理解过程,不做任何画图讲解
#include <iostream>
using namespace std;
//前置声明
class string;
//计数器
class string_rep
friend class String;
public:
//构造函数
explicit string_rep(const char* str = ""):m_count(0)
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
//拷贝构造函数
string_rep(const string_rep &rep):m_count(0)
//浅拷贝
m_data = rep.m_data;
//赋值重载
string_rep&operator=(const string_rep &rep)
if (this != &rep)
m_data = rep.m_data;
return *this;
//析构
~string_rep()
delete []m_data;
m_data = nullptr;
public:
//计数器+1
void increment()
m_count++;
//计数器-1
void decrement()
m_count--;
if (m_count == 0)
delete this;
char* GetData()const
return m_data;
private:
char* m_data;
int m_count;
;
class String
public:
explicit String (const char *str=""):pn(new string_rep(str))
pn ->increment();
String(const String &s):pn(s.pn)
pn ->increment();
String&operator=(const String &s)
if (this != &s)
//这里先对计数器减1的操作是因为当你进行赋值的时候,改变了pn的指向,其原来的计数器m_count必须-1;
pn ->decrement();
pn = s.pn;
pn ->increment();
return *this;
~String()
pn ->decrement();
public:
//写时拷贝(转换大小写)
void to_upper()
auto *new_pn = new string_rep(pn ->m_data);
pn ->decrement();
pn = new_pn;
pn ->increment();
char *p = pn ->m_data;
while (*p != '\\0')
if (*p >= 'a' && *p <= 'z')
*p -= 32;
p++;
private:
string_rep *pn;
;
以上是关于C++——浅拷贝深拷贝的主要内容,如果未能解决你的问题,请参考以下文章