今天学了运算符的重载,对于c++,相比C语言而言语法又多且杂,难背又难记,最近真有点懈怠......还是要加油
#ifndef _STRING_H_
#define _STRING_H_
#include <iostream>
using namespace std;
class String
{
public:
//static int MAX_LEN;
//friend class StringTool;
//friend void print(const String &s1);
String();
String(char *str);
~String();
String(const String& other);
void myStrcat();
void Display() const;
void setMAXLEN(int maxLen);
int getMAXLEN();
String& operator=(const String& other);
String& operator=(char *str);
char& operator[](unsigned int index);
const char& operator[](unsigned int index) const;
String& operator+=(const String &s);
friend String operator+(const String& s1, const String& s2);
friend ostream& operator<<(ostream &out, const String &s);
friend istream& operator>>(istream &in,String& s);
operator char *();
private:
char *str_;
static const int MAX_LEN = 1024;
//String(const String& other);//绂佹鎷疯礉
};
#endif
#include <iostream>
#include <string.h>
#include "String.h"
using namespace std;
//int String::MAX_LEN = 1024;
String::String()
{
str_ = new char('\0');
cout << "default constrcutor String" << endl;
}
String::String(char *str)
{
cout << "construct String" << endl;//str_ = str;
int len = strlen(str) + 1;
str_ = new char[len];
memset(str_,0,len);
strcpy(str_,str);
}
String::String(const String& other)
{
int len = strlen(other.str_) + 1;
str_ = new char[len];
memset(str_,0,len);
strcpy(str_,other.str_);
}
String::~String()
{
cout << "destroy String" << endl;
delete [] str_;
}
String::operator char*()
{
return str_;
}
String& String::operator=(const String& other)
{
if(this == &other)
{
return *this;
}
int len = strlen(other.str_) + 1;
delete [] str_;
str_ = new char[len];
memset(str_,0,len);
strcpy(str_,other.str_);
return *this;
}
String& String::operator=(char *str)
{
cout << "operator char *str" << endl;
int len = strlen(str) + 1;
delete [] str_;
str_ = new char[len];
memset(str_,0,len);
strcpy(str_,str);
return *this;
}
char& String::operator[](unsigned int index)
{
cout << "no const []" << endl;
return const_cast<char&>(static_cast<const String&>(*this)[index]);
}
const char& String::operator[](unsigned int index) const
{
cout << "const []" << endl;
return str_[index];
}
String operator+(const String& s1, const String& s2)
{
/*
int len = strlen(s1.str_) + strlen(s2.str_) + 1;
char *newptr= new char[len];
memset(newptr,0,len);
strcpy(newptr,s1.str_);
strcat(newptr,s2.str_);
String temp(newptr);
*/
String temp(s1);
temp += s2;
return temp;
}
String& String::operator+=(const String &s)
{
int len = strlen(str_) + strlen(s.str_) + 1;
char *newptr = new char[len];
strcpy(newptr,str_);
strcat(newptr,s.str_);
delete [] str_;
str_ = new char[len];
strcpy(str_,newptr);
return *this;
}
ostream& operator<<(ostream &out, const String& s)
{
out << s.str_;
return out;
}
istream& operator>>(istream &in, String& s)
{
char buffer[1024];
in >> buffer;
int len = strlen(buffer) + 1;
delete [] s.str_;
s.str_ = new char[len];
strcpy(s.str_,buffer);
return in;
}
void String::Display() const
{
cout << str_ << endl;
}
void String::setMAXLEN(int maxLen)
{
}
int String::getMAXLEN()
{
return MAX_LEN;
}
#include <iostream>
#include "String.h"
#include "Stringtool.h"
using namespace std;
int main()
{
#if 0
String s1;
s1 = "hello";
cout << s1[1] << endl;
s1[1] = 'E';
s1.Display();
String s2("world");
cout << s2[1] << endl;
//s[2] = 'L';
String s3("kkk");
//s3 = s1 + s2;
s3+=s1;//s3 = s3 + s1;
s3.Display();
#endif
String s("hello world");
cout << s << endl;
cin >> s;
cout << s << endl;
char *ptr = static_cast<char *>(s);
cout << ptr << endl;
return 0;
}