时间:2021-05-20
实例如下:
#include<iostream>using namespace std; class String;ostream& operator<<(ostream &out, const String&s);//引用计数器类class String_rep { friend class String; friend ostream& operator<<(ostream &out, const String&s);public: String_rep(const char *str ) :use_count(0) { if (str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[strlen(str) + 1]; strcpy(data, str); } } String_rep(const String_rep &rep) :use_count(0) { data = new char[strlen(rep.data) + 1]; strcpy(data, rep.data); } String_rep& operator=(const String_rep &rep) { if (this != &rep) { delete[]data; data = new char[strlen(rep.data) + 1]; strcpy(data, rep.data); } return *this; } ~String_rep() { delete[]data; data = NULL; }public: void increase() { ++use_count; } void decrease() { if (use_count == 0) { delete this; //自杀行为 释放this所指的空间,在释放之前调动这个类的析构函数 } }private: char *data; int use_count;};////////////////////////////////////////////////////////////////////////////////////////class String{ friend ostream& operator<<(ostream &out, const String&s);public: String(const char* str = " ") { rep = new String_rep(str); rep->increase(); } String(const String &s) { rep = s.rep; //浅拷贝 rep->increase(); } String& operator=(const String &s) { if (this != &s) { rep->decrease(); //模拟delete rep = s.rep; //模拟new rep->increase(); //模拟strcpy } return *this; } ~String() { rep->decrease(); }public: void to_upper() { if (rep->use_count > 1) { String_rep* new_rep = new String_rep(rep->data); rep->decrease(); rep = new_rep; rep->increase(); } char* ch = rep->data; while (*ch != '\0') { *ch -= 32; ++ch; } }private: String_rep *rep; //引用计数器};ostream& operator<<(ostream &out, const String&s){ out << s.rep->data; return out;}void main(){ String s1("hello"); String s2(s1); String s3; s3 = s2; cout << "s1=" << s1 << endl; cout << "s2=" << s2 << endl; cout << "s3=" << s3 << endl; s2.to_upper(); cout << "-----------------------------------------------" << endl; cout << "s1=" << s1 << endl; cout << "s2=" << s2 << endl; cout << "s3=" << s3 << endl;}以上这篇String类的写时拷贝实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
写时拷贝何为写时拷贝?前面我说过深拷贝浅拷贝,今天我们来探究一下写时拷贝。深拷贝是补充了浅拷贝的不足,写时拷贝其实也就是补充一点深拷贝的不足。其实写时拷贝的意思
详解C++编写String的构造函数、拷贝构造函数、析构函数和赋值函数编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:classS
在输出日期信息时,经常需要输出不同格式的日期格式,本实例中介绍了String字符串类中的日期格式化方法,实例使用不同的方式输出String类的日期格式参数值,组
C++中类的拷贝、赋值、销毁的实例详解本篇文章我们一共讲解一下几个知识点:类的拷贝构造函数。类的拷贝赋值运算符。类的析构。好了onebyone如果我们没有定义类
copy—拷贝文件说明copy(string$source,string$dest[,resource$context]):bool将文件从source拷贝到d