array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 第十八章 38总结 - 爱码网
// 38总结
#include <iostream>
using namespace std;
class String
{
public:
	String(); //默认的构造函数
	~String(){ delete []str; len=0; cout<<"析构函数执行"<<endl; }
	String(const char*const ch); //构造带值的string
	
	int getlen()const { return len;}   //读取长度
	//const char *getstr()const{ return str;} //读取字符串

	//重载输出函数
	friend ostream&operator<<(ostream &o, const String &s)
	{
		o<<s.str;
		return o;
	}
    
	friend istream&operator>>(istream &i, String &s)
	{
		 i>>s.str;
	     return i;
	}
	//当运算符重载函数定义为成员函数时,二元运算符只带一个参数
	//将这个函数定义为友元函数即可
	friend bool operator<(const String&str1, const String&str2)
	{
		if(strcmp(str1.str, str2.str) < 0){
		    return 1;
		}else
			return 0;
	}
	friend bool operator>(const String&str1, const String&str2)
	{
		if(strcmp(str1.str, str2.str) > 0){
		    return 1;
		}else
			return 0;
	}
	friend bool operator==(const String&str1, const String&str2)
	{
		if(strcmp(str1.str, str2.str) == 0){
		    return 1;
		}else
			return 0;
	}


	//这里是可以修改的
	char &operator[](unsigned short int  length);
	char  operator[](unsigned short int  length)const;

	//复制构造函数
	String (const String&r);

	//重载赋值运算符=
	String &operator=(const String &s);

	String operator+(const String&s); //重载相加运算符
	void operator+=(const String&s); //重载相加运算符
	

private:
	String(unsigned short int); //构造带值的string
	unsigned short int len;
	char *str;
};
//创建一个空的str变量
String::String()
{
    len = 0;
	str = new char[1];
	str[0] = '\0';
};
String::String(const char*const ch)
{
	cout<<"带一个参数的构造函数"<<endl;
	len = strlen(ch);
	str = new char[len+1];
	for(int i=0; i<len; i++){
	   str[i] = ch[i];
	}
	str[len] = '\0';
};


String::String(unsigned short int lenght)
{
	cout<<"带一个int参数的构造函数"<<endl;
	len = lenght;
	str = new char[len+1];
	for(int i=0; i<=len; i++){
	   str[i] = '\0';
	}
};

char & String::operator[](unsigned short int length)
{
	    if(length > len){
		   return str[len-1]; //返回可见字符的值
		}else{
		   return str[length];
		}
};

char String::operator[](unsigned short int length)const
{
	    cout<<"下标运算符const执行"<<endl;
		if(length > len){
		   return str[len-1]; //返回可见字符的值
		}else{
		   return str[length];
		}
};

String::String (const String&rs)
{
	len = rs.getlen();
	str = new char[len+1];
	for(int i=0; i<len; i++){
	    str[i] = rs[i]; 
		//这里因为我们构造一个新对象并且用旧对象来为它赋值,很明显,不会修改旧对象的值,所以旧对象rs在调用operator[]const函数的时候,不用将指定字符串的地址返回,只需要要按值返回这个字符即可
		//第二次重载的operator[]运算符函数,按值返回的一个字符,同时在函数体前面加了一个const
		//表示该函数可以操作const对象,也就是rs
		//这样由于2个同名的函数,它的类型不同,一个可操作const对象,一个不可以,这样就可以做到了对函数的重载
	}
	str[len]='\0';
	cout<<"复制构造函数完成:"<<str<<endl;

};

String& String::operator=(const String &s)
{
	cout<<"operator=执行"<<endl;
	if(this == &s)
	{
	    return *this;
	}else{
	    delete []str; //删除左边的字符串
		len = s.getlen();
		str = new char[len+1];
		for(int i=0; i<len; i++){
		    str[i] = s[i];
		}
		str[len] = '\0';
	}
	return *this; //注意按引用返回,也就是别名
}

String String::operator+(const String &s)
{
	cout<<"operator+执行......"<<endl;
	int total = len + s.getlen();
	String temp(total);
	int i, j;
	for(i=0; i<len; i++){
	     temp[i] = str[i];
	}
	for(j=0; j<s.getlen(); j++, i++){
	    temp[i] = s[j];
	}
	return temp;
}



void String::operator+=(const String&s)
{
	cout<<"这里执行的是相+=运算符"<<endl;
	int total = len + s.getlen();
	String temp(total);
	int i, j;
	for(i=0; i<len; i++){
	    temp[i] = str[i];
	}
	for(j=0; j<s.getlen(); j++,i++){
	    temp[i] = s[j];
	}
	*this = temp;
}


int main()
{
	//1 可对字符串进行初始化
	String s1 = "hello wordl";
	//2 可计算字符串的长度
	cout<<"s1字符串长度:"<<s1.getlen()<<endl;
	//3 可对字符串进行赋值操作
	String s2;
	s2 = s1;
	//4 重载了字符串的输出
	cout<<s1<<s2<<endl;

	//5 通过重载输入字符串,输入字符串
	//cin>>s1>>s2;
	//cout<<s1<<s2<<endl;

	//6 可将char字符串赋值给String
	char ch[11] = "not at all";
	s1 = ch;
	cout<<s1<<endl;

	//7 可向构造对象那样构造字符串
	String s3;
	String s4("mother");

	//8 可用下标运算符来操作字符串
	cout<<s4<<endl;
	cout<<s4[0]<<endl;

	//9 可以比较
	s1 > s2;

	//10 两个对象可以相加
	s1="aaa";
	s2="bbb";
	s3 = s1 + s2;
	cout<<"s3:"<<s3<<endl;

	//12可以进行+=操作
	s1 += s2;
	cout<<"s1:"<<s1<<endl;
	String s5("a");
	s1 = s5;
	cout<<"s1:"<<s1<<endl;
	
	return 0;
}

  

相关文章: