String类的实现 三大复制控制函数
2016-05-19 11:46
274 查看
1.深拷贝
</pre><pre code_snippet_id="1689102" snippet_file_name="blog_20160519_1_1528207" name="code" class="cpp">#include <iostream> using namespace std; class String{ public: friend ostream& operator<<(ostream& out, const String& str);//友员 String(const char * str = NULL);// 默认参数 String(const String &str); String& operator=(const String &str); ~String(); private: ostream& outPut(ostream& out)const;//const char *data; }; String::String(const char* str){ if (str == NULL){ // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断 data = new char[1]; data[0] = '\0'; } else{ int len = strlen(str); data = new char[len + 1]; strcpy(data, str); } } String::String(const String& str){ // 得分点:输入参数为const型 int len = strlen(str.data); data = new char[len + 1]; strcpy(data, str.data); } String& String::operator =(const String &str){ if (this != &str){ //得分点:检查自赋值 String tmp(str); char *tmp_data = tmp.data; tmp.data = data; data = tmp_data; } return *this; } String::~String(){ delete[]data; } ostream& String::outPut(ostream& out)const{ //const成员函数 out << data; return out; } ostream& operator<<(ostream& out, const String& str){// return str.outPut(out); } int main(){ char* p = "Hello World !"; String s(p); cout << s << endl; String s1("How are you ?"); cout << s1 << endl; String s2(s1); cout << s2 << endl; s = s2; cout << s << endl; return 0; }
2.浅拷贝
#include<iostream> using namespace std; //模拟new[],在前面多开4个字节来存引用计数 class String { public: String(char* str = "") :_str(new char[strlen(str) + 5]) { _str += 4; _GetRefCount(_str) = 1; strcpy(_str, str); } String(const String& s) :_str(s._str) { ++_GetRefCount(_str); } String& operator=(const String& s) { if (_str != s._str) { _Release(); _str = s._str; ++_GetRefCount(_str); } return *this; } char& operator[](size_t index) { if (_GetRefCount(_str) > 1) { char* tmp = new char[strlen(_str) + 5]; tmp += 4; _GetRefCount(tmp) = 1; strcpy(tmp, _str); --_GetRefCount(_str); _str = tmp; } return _str[index]; } ~String() { cout << "~String()" << endl; _Release(); } int& _GetRefCount(char* str) { return(*(int*)(str - 4)); } void _Release() { if (--(_GetRefCount(_str)) == 0) { delete[](_str - 4);//指针返回首地址位置,释放整段空间 } } void put() { cout << _GetRefCount(_str) << "---------" << _str << endl; } private: char* _str; }; void Test() { String S; String s1 = "abclefg"; String s2(s1); S.put(); s1.put(); s2.put(); s2 = s1; s2.put(); cout << "**********************" << endl; String s3 = "hijklmn"; String s4(s3); s3.put(); s3 = s1; s3.put(); cout << "**********************" << endl; s1.put(); s1[3] = 'd'; s1.put(); s2.put(); } int main() { Test(); return 0; }
1---------
2---------abclefg
2---------abclefg
2---------abclefg
**********************
2---------hijklmn
3---------abclefg
**********************
3---------abclefg
1---------abcdefg
2---------abclefg
~String()
~String()
~String()
~String()
~String()
相关文章推荐
- 【Leetcode】之Unique Paths II
- SQL语句insert into 不存在则插入 or 存在则修改
- 微软Web服务器受到欢迎的原因
- c++第6次实验-项目2-数组合并
- 349. Intersection of Two Arrays [easy] (Python)
- c++第六次实验
- uva10605 最大公共子序列转化为最大上升子序列
- Cookie技术分析与理解
- Spring mvc 自定义拦截器【详解】
- .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?
- 使用maven搭建Java Web的spring MVC项目
- symfony2 学习2 表单创建 使用
- Shell 统计PV, UV ,独立IP
- Tomcat发布路径研究
- 双工通信
- 给 Android 开发者的 RxJava 详解
- JQery icheck 插件
- 用gunicorn+gevent启动Flask项目
- 在主函数中调用其他文件内的函数
- Execution failed for task ':xxx:packageAllDebugClassesForMul tiDex'. > java.util