编写类 String 的构造函数、析构函数和赋值函数

来源:互联网 发布:陈小春新拍电视剧网络 编辑:程序博客网 时间:2024/06/05 03:47
#include <iostream>#include<string>using namespace std;class String{public:    friend ostream &operator<<(ostream& os, String& s);    //这个版本需要考虑用一个赋值String str1(str2);    //当str2为空字符串,调用拷贝构造函数时strlen不能求空字符串的值,导致    //程序崩溃问题    //String()  //默认构造函数         //  :_str(NULL)    //{    //  cout << "String()" << endl;    //}    //String()     //  :_str (new char[1])    //{    //  cout << "String()" << endl;    //  *_str = '/0';    ////    *_str = "/0";    //}    //String(const char * s)       //  :_str (new char[strlen(s)+1])    //{    //  cout << "String(const char *s)" << endl;    //  strcpy(_str, s);    //}    //将默认构造和构造函数合并    String(const char * s="")           :_str (new char[strlen(s)+1])    {        cout << "String(const char *s)" << endl;        strcpy(_str, s);    }    String(const String &s)   //拷贝构造传参必须是引用          :_str(new char[strlen(s._str)+1] )          //并未考虑空指针传给strlen的问题    {        cout << "String(const String &s)" << endl;            strcpy(_str,s._str);    }    //String & operator=(const String &s)      //{    //  cout << "String & operator=(const String &s)" << endl;    //  if (s._str != _str)       //如果不考虑自赋值问题,可能导致自身内容被销毁    //  {    //      delete[]_str;    //      _str = new char[strlen(s._str) + 1];    //      strcpy(_str, s._str);    //  }    //  return *this;    //}    //现代写法    String & operator=( String s)      //如果是引用会导致原来申请的堆空间未释放    {        cout << "String & operator=(const String &s)" << endl;        std::swap(_str, s._str);          //s是实参的一份临时拷贝,所以出了这个函数作用域,会自行销毁        return *this;    }    ~String()    {        cout << "~String()" << endl;        if (_str != NULL)        {            delete[]_str;        }    }private:    char* _str;};ostream &operator<<(ostream& os, String& s){    os << s._str;    return os;}int main(){    //string str = "abcdef";    //string str1 = str;    String str1("abcdef");    //String str2(str1);    String str3 ;    str3 = str1;    cout << str1 << endl;    cout << str3 << endl;    //cout << str2 << endl;    //cout << str1 << endl;    return 0;}

总结:

   在实现时要考虑内存泄漏问题,在实现赋值时非现代版本考虑自赋值问题所带来的后果,以及实现默认构造函数将指针置空,会带来什么后果,以及什么时候该用引用,什么时候不该用。以及要注意的是strlen不能传一个空指针让它去求字符串的长度等等。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机触摸屏不灵了怎么办 mac触摸板失灵怎么办 苹果屏幕触摸失灵怎么办 三星手机屏幕没反应怎么办 手机开机定屏怎么办 手机触摸局部失灵怎么办 苹果手机屏幕按键失灵怎么办 5s锁屏键坏了怎么办 平板版本太低怎么办 手机屏局部失灵怎么办 iphone8触屏不灵敏怎么办 苹果机8屏幕失灵怎么办 车钥匙丢车上怎么办 指纹锁华盖坏了怎么办 非法入了户口怎么办 司考成绩单丢了怎么办 小饭桌转让手续怎么办 两个领导不和你怎么办 两个领导意见不一致怎么办 两个领导对立我怎么办 投诉申通没用怎么办 领导作风有问题怎么办 做完火疗受风了难受怎么办 鼻子做的不好看怎么办 埋线双眼皮出血怎么办 割完双眼皮出血怎么办 全切双眼皮出血怎么办 割双眼皮出血了怎么办 割双眼皮后出血怎么办 双眼皮手术后出血怎么办 缝双眼皮开了怎么办 朋友网没了怎么办 压疮发生后怎么办 学籍账号已登录怎么办 护士学分不达标怎么办 高中学籍错了怎么办 定时器时间太短不够用怎么办? 考试时间不够用怎么办 感觉时间不够用怎么办 学习时间不够用怎么办 天天时间不够用怎么办