鱼C论坛

 找回密码
 立即注册
查看: 2439|回复: 1

C++自定义String类出现的若干问题

[复制链接]
发表于 2012-6-10 09:51:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class String{
  5. public:
  6.     String();
  7.     String(char *_str);
  8.     String(unsigned short int length);
  9. //    friend ostream& operator<<(ostream &o,String &_str);
  10.         String(String &obj);
  11.     bool operator ==(String &string);
  12.     String operator+(String &string);
  13.     char *get(){return str;}
  14.     String& operator=(const String &s);
  15.     ~String();
  16. protected:
  17.     char *str;
  18. };
  19. /*ostream& operator<<(ostream &o,String &_str)
  20. {
  21.         o<<_str.str;
  22.         return  o;
  23. }*/
  24. String& String::operator=(const String &s)
  25. {
  26.         cout<<"operator=调用了!"<<endl;
  27.     int i;
  28.     delete [] str;
  29.     str=new char[strlen(s.str)+1];
  30.     for(i=0;i<strlen(s.str);i++)
  31.         str[i]=s.str[i];
  32.     str[i]='\0';
  33. //    length=s.length;
  34.     return *this;
  35. }
  36. String::String()
  37. {
  38.     str=new char[1];
  39.     str[0]='\0';
  40. }
  41. String::String(char *_str)
  42. {
  43.     int i,len=strlen(_str);
  44.     str=new char[len+1];
  45.     for(i=0;i<len;i++)
  46.     {
  47.         str[i]=_str[i];
  48.     }
  49.     str[i]='\0';
  50. }
  51. String::String(unsigned short int length)
  52. {
  53.     int len=length;
  54.     str=new char[len+1];
  55.     for(int i=0;i<len;i++)
  56.     {
  57.         str[i]='\0';
  58.     }
  59. }
  60. String::String(String &s)
  61. {
  62.         cout<<"拷贝构造函数执行!"<<endl;
  63.     int n=strlen(s.str);
  64.     str=new char[n+1];
  65.     for(int i=0;i<n;i++)
  66.     {
  67.         str[i]=s.str[i];
  68.     }
  69.     str[n]='\0';
  70. //    length=s.length;
  71. }
  72. bool String::operator == (String &string)  //判断字符串是否相等
  73. {
  74.         if(str!=NULL&&string.str!=NULL)
  75.         {
  76.             int i;
  77.                 int len1=strlen(str);
  78.             int len2=strlen(string.str);
  79.             for(i=0;i<=len1&&i<=len2;i++)
  80.             {
  81.                 if((str[i])!=(string.str[i]))
  82.                 {
  83.                     return false;
  84.                 }

  85.             }
  86.             return true;
  87.         }
  88.         if(str==NULL&&string.str==NULL)
  89.                 return true;
  90.         else
  91.                 return false;
  92. }
  93. String String::operator + (String &string)
  94. {
  95.         int len;
  96.         len=strlen(string.str);
  97.         String temp;
  98.         delete [] temp.str;
  99.         temp.str=new char[strlen(str)+len+1];
  100.         strcpy(temp.str,str);
  101.         strcat(temp.str,string.str);
  102.         return temp;
  103. }
  104. String::~String()
  105. {
  106.     delete [] str;
  107. }
  108. int main()
  109. {
  110.     String str1("hello");
  111.     String str2("world");
  112.         cout<<"str1="<<str1.get()<<endl;
  113.         cout<<"str2="<<str2.get()<<endl;
  114.     if(str1==str2)   //比较字符串是否相等
  115.         cout<<"str1==str2"<<endl;
  116.     else
  117.                 cout<<"str1!=str2"<<endl;
  118.        
  119.         String str3;
  120.         str3=str1+str2;
  121.         cout<<"str3="<<str3.get()<<endl;
  122.         return 0;
  123. }
复制代码

以上代码在不同的编译器有不同的结果,在C-Free中编译不过,提示error: no matching function for call to `String::String(String)',就是发生在str3=str1+str2;上,VC6和code::blocks能通过!但是调用的方式不同。
VC6的结果:
str1=hello
str2=world
str1!=str2
拷贝构造函数执行!
operator=调用了!
str3=helloworld
Press any key to continue
code::blocks的结果:
str1=hello
str2=world
str1!=str2
operator=调用了!
str3=helloworld
我想问的是为什么C-free会出错,复制构造函数在VC6和code::blocks里面都没问题啊!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-14 20:55:20 | 显示全部楼层
无参构造指针最好给赋空值
拷贝构造给const 不然会出现严重问题 你的编译错误估计就是因为这
+号重载返回值给const  否在会出现这种"a" + "b" = "1" 这种无理表达式编译正确

按照你写的拷贝构造 会有个内存泄露 你无参构造里new的空间为何不释放
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 16:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表