14. string类(晕)
#if 1
#include<iostream>
using namespace std;
class String{
char *data;
int n;
public:
String(const char *s=0){
if(s==0){
data = 0; n=0; return;
}
const char *p = s;
while(*p) p++;
n = p-s;
data = new char[n+1];
for(int i=0; i<n; i++)
data[i] = s[i];
data[n] = '\0';
}
char operator[](int i)const {
if(i<0 || i>=n) throw "下标非法";
return data[i];
}
char& operator[](int i) {
if(i<0 || i>=n) throw "下标非法";
return data[i];
}
};
ostream & opeartor<<(ostream &o, String s){
for (int i=0; i < str2.size(); i++)
cout << s[i];
return o;
}
int main()
{
String str,str2("Hello World!\n");
str2[1] = 'E'; //调用的是char& operator[](int i)
cout << str2 << endl;
String s3 = str2;
cout << s3 << endl;
s3[3] = 'L';
cout << s3 << endl;
cout << str2 << endl;
}
}
#endif
默认情况下会有拷贝构造函数(硬拷贝)
#if 1
#include<iostream>
using namespace std;
class String{
char *data;
int n;
public:
String(const String &s){ //默认生成的拷贝构造函数,这里只是写出来了
cout << "拷贝构造函数!\n";
data = s.data;
n=s.n;
}
String(const char &s){
cout << "拷贝构造函数!\n"; //重新定义,默认也是这样
data = new char[s, n+1];
n = s.n;
for(int i=0; i<n; i++)
data[i] = s.data[i];
data[n] = '\0';
}
// 类结束后自动调用的一个函数,先创建的后销毁
~String(){
cout << "析构函数!\n"; // 析构函数
delete[] data;
}
String(const char *s=0){
if(s==0){
data = 0; n=0; return;
}
const char *p = s;
while(*p) p++;
n = p-s;
data = new char[n+1];
for(int i=0; i<n; i++)
data[i] = s[i];
data[n] = '\0';
}
char operator[](int i)const {
if(i<0 || i>=n) throw "下标非法";
return data[i];
}
char& operator[](int i) {
if(i<0 || i>=n) throw "下标非法";
return data[i];
}
};
ostream & opeartor<<(ostream &o, String s){
for (int i=0; i < str2.size(); i++)
cout << s[i];
return o;
}
int main()
{
String str,str2("Hello World!\n");
str2[1] = 'E'; //调用的是char& operator[](int i)
cout << str2 << endl;
String s3 = str2;
cout << s3 << endl;
s3[3] = 'L';
cout << s3 << endl;
cout << str2 << endl;
}
}
#endif