类String的构造函数、析构函数和赋值函数
2012-08-22 09:52 javaspring 阅读(441) 评论(0) 编辑 收藏 举报1、代码如下:
注意:形参加上const修饰符,函数体里面判断参数是否为NULL,引用不能为空等。
复制操作符应该判断是否是自赋值。
重载输入操作符时,要注意给data分配足够的空间,现在还没有想到太好的办法,用的是临时变量,这里一直不是很明白C++中的(string s; cin>>s;)到底最大可以读取多少个字符,其原理又是怎么实现的呢。
友元函数有时候编译器会有bug,解决方法如下:事先声明类和友元函数(在类外面不能用friend 关键字)
class String;
ostream& operator<<(ostream& out,const String& s);
stream& operator>>(istream& in,const String& s);
bool operator<(const String& s1,const String &s2);
#include "stdafx.h" #include <iostream.h> #include <string.h> class String { public: String(); String(const char *str); String(const String &s); ~String(); String& operator=(const String &str); friend ostream& operator<<(ostream& out,const String& s); friend istream& operator>>(istream& in,String& s); friend bool operator<(const String& s1,const String &s2); char& operator[](int pos) { cout<<"index operator"<<endl; int len=strlen(data); if (pos>=len) { return data[len-1]; } else { return data[pos]; } } private: char *data; }; //默认构造函数 String::String() { cout<<"default constructor"<<endl; data=new char[1]; *data='\0'; } //带参数构造函数 String::String(const char *str) { cout<<"parameter constructor"<<endl; if (str==NULL) { data=new char[1]; *data='\0'; } else { int len=strlen(str); data=new char[len+1]; strcpy(data,str); } } //复制构造函数 String::String(const String &str) { cout<<"copy constructor"<<endl; int len=strlen(str.data); data=new char[len+1]; strcpy(data,str.data); } //析构函数 String::~String() { cout<<"destructor"<<endl; delete[] data; } //赋值操作符 String& String::operator=(const String &str) { cout<<"assign operator"<<endl; if (this!=&str) { int len=strlen(str.data); delete[] data; data=new char[len+1]; strcpy(data,str.data); } return *this; } //输出操作符 ostream& operator<<(ostream& out,const String& s) { cout<<"cout operator"<<endl; out<<s.data<<endl; return out; } //输入操作符 istream& operator>>(istream& in,String& s) { cout<<"cin operator"<<endl; //这个地方很伤神,目前没有想到很好的办法,只能先用中间变量来获取输入的长度,然后释放中间变量 char *sTemp=new char[1000]; in>>sTemp; delete[] s.data; int len=strlen(sTemp); s.data=new char[len+1]; strcpy(s.data,sTemp); delete[] sTemp; return in; } //比较操作符 bool operator<(const String& s1,const String &s2) { cout<<"compare operator"<<endl; if (strcmp(s1.data,s2.data)<0) { return 1; } return 0; } void main() { String s1; //default constructor String s2("12345"); //parameter constructor String s3=s2; //copy constructor s1=s2; //assign operator cin>>s1; //输入操作符 cout<<s1; //输出操作符 cout<<(s1<s2)<<endl; //比较操作符 cout<<(s1[5])<<endl; //获取字符 //destructor destructor destructor }