这次主要是实践一下内存的管理和类的一些写法。当然了,还包括<<运算符的重载。
一些需要注意的点:
1.内存空间的管理一定要处理好,new[]一定要搭配delete[]使用
2.拷贝赋值函数要检测是否是自我赋值,不然内存空间会直接销毁
3.为了可以连续使用=和<<,返回值务必使用引用
4.其它的就是一些编码小细节了,代码里面大部分都有注释
PS:今天才发现字符数组居然是可以直接输出的。我之前都是一个个遍历的,人晕了
#include<iostream>
#include<cstring>
using namespace std;
class MyString{
public:
MyString(const char *s = 0);
MyString(const MyString &str);
MyString& operator=(const MyString &str);
~MyString();
void display();
friend ostream &operator<<(ostream &o, const MyString &str)
{
o<<str.myString;
return o;
}
private:
char *myString;
int m_size;//需要记录字符串长度
};
void MyString::display(){
char *p = myString;//这里需要暂存这个指针,不然会内存溢出
for(int i=0;i<m_size;i++){
cout<<*myString;
myString++;
}
myString = p;//赋值回去
cout<<endl;
}
MyString::MyString(const char *s){
if(s!=nullptr){
m_size = strlen(s);
myString = new char[m_size+1];
strcpy(myString,s);
}else{
m_size = 0;
myString = new char[m_size+1];
myString[0] = '\0';
}
}
MyString::MyString(const MyString &str){//需要加const限定类型
//这里是构造函数 所以不需要删除原本的空间
m_size = str.m_size;
myString = new char[m_size + 1];
strcpy(myString, str.myString);
}
MyString::~MyString(){
delete[] myString;//new【】 和 delete【】一定要组合使用
}
MyString& MyString::operator=(const MyString &str){
//需要添加自我赋值判断
if(&str==this){
return *this;//返回的是引用
}
m_size = str.m_size;//得到空间大小
delete[] myString;
//申请新的内存空间
myString = new char[m_size+1];
strcpy(myString,str.myString);//赋值
return *this;//返回本对象的引用
}
//主函数测试
int main(){
char s1[] = "string1";
char s2[] = "string2";
int a[] = {1,2,3,4,5,6,7,8,9};
MyString mstr1(s1);//使用s对MyString赋值
mstr1.display();
MyString mstr2(s2);
mstr2.display();
mstr2 = mstr1;
mstr2.display();
MyString mstr3(mstr1);
mstr3.display();
cout<<mstr3<<endl;
cout<<s1<<endl;//试验了一下,字符数组可以直接被这样输出
}