string类的实现终极版

写时拷贝(COW)的实现:

#include<iostream>
#include<cassert>

using namespace std;

class String
{
public:
	String(char *str="")
		:_str(new char[strlen(str)+sizeof(int)+1])
	{
		*(int*)_str=1;
		_str+=4;
		strcpy(_str,str);
	}

	String(const String& str)
		:_str(str._str)
	{
		++(*(int*)(_str-4));
	}

	~String()
	{
		if(_str!=NULL)
		{
			if(--(*(int*)(_str-4)))
			{
				delete[] (_str-4);
			}
		}
	}

	String& operator=(const String& str)
	{
		if(this!=&str)
		{
			if(--(*(int*)(_str-4)))
			{
				delete[] (_str-4);
			}
			_str=str._str;
			++(*(int*)(_str-4));
		}
		return *this;
	}

	char& operator[](int index)
	{
		assert(index>=0 && index<strlen(_str));
		_str[index]=*(_str+index);
		return _str[index];
	}

	friend ostream& operator<<(ostream& os,const String& str);

private:
	char *_str;
};

ostream& operator<<(ostream& os,const String& str)
{
	cout<<str._str<<endl;
	return os;
}

int main()
{
	//String s1("hello");
	String s2("abcdefg");
	cout<<s2;
	cout<<s2[0];
	getchar();
	//String s3=s2;
	//String s3(s2);
	return 0;
}
时间: 2025-01-05 02:56:59

string类的实现终极版的相关文章

C++ Primer Plus 第六版 第16章 string类和标准模板库

1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数 2.size_type是一个依赖于实现的整形 string将string::npos定义为字符串的最大长度 3.string类的构造函数P656 4.对于c-风格字符串,3种输入方法:cin>>   cin.getline(),cin.get 对于string   ,2种输入方法:cin>>,getline(cin,string对象) 5.st

1——自我实现一个简洁版的String类

在C++中有C没有的string字符串类型,string类型的数据其实是一个指向字符串首地址的指针变量,因此在string类的默认成员函数拷贝构造和赋值运算符的重载就会涉及到深浅拷贝的问题,一不小心要么就是内存泄露要么就是多次释放同一块空间导致程序崩溃,下面就来模拟实现一个简洁版的String类: 既然是指向一个字符串的指针,因此类的成员变量就需要有一个char*类型的指针: #include <iostream> #include <string.h> using namespa

实现简洁版的string类

#include<iostream> using namespce std; class String { public: String() :_str(new char[1]) { _str='\0'; } String(const char* str)//一个字符串的拷贝 :_str(new char[strlen(str)+1] { strcpy(_str,str); } String (const String&str)//一个对象的拷贝 :_str(NULL) { Strin

[转]py编码终极版

py编码终极版 原文链接:http://www.cnblogs.com/yuanchenqi/articles/5956943.html 一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为"明文"(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英文单词都算作明文. 其次,我们需要能将明文表示的消息转成另外某种表示,我们还需要能将编码文本转回成明文.从明文到编码文本的转换称为"编码&qu

自制进制转换终极版

/** * 自制进制转换终极版 * 过程不重复了. */ public class TransFinal { public static void main(String[] args) { int num = 26; String hex = toHex(num); String oct = toOct(num); String bin = toBin(num); System.out.println("十六进制: "+ hex); System.out.println("

08重编终极版《东邪西毒:终极版》DVD粤语中字

1.东邪西毒].Ashes.of.Time.1994.384p.DVDRip.x264.ac3-DTMM.mkv 这个版本最清晰 ,可惜删减了,只有87分钟,粤语,1.4G. 2.东邪西毒(初始版).Ashes.Of.Time.1994.X264.AAC.D5-MINISD.lever1119.mkv 日本发行的,画质昏黄,可惜是国语的,片头日语说明,100分钟,805M. 3.[东邪西毒].Ashes.of.Time.1994.iNTERNAL.SUBBED.DVDRip.XviD-CFE.A

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

String类无子类

1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.  final类不能被继承,没有子类,final类中的方法默认是final的.  final方法不能被子类的方法覆盖,但可以被继承.  final成员变量表示常量,只能被赋值一次,赋值后值不再改变.  final不能用于修

vim--vim终极配置文件之最终极版

""""""""""""""""""""""""""""""""""""""""" " A