免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1088 | 回复: 4
打印 上一主题 下一主题

赋值运算符“=”的重载问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-07 13:08 |只看该作者 |倒序浏览
请问这个代码中:
#include<iostream.h>
#include<string.h>
class string{
        char *ptr;
public:
        string (char *s)
        {ptr=new char[strlen(s)+1];
        strcpy(ptr,s);
        }
        ~string()
        {delete ptr;}

        void print()
        {cout<<ptr<<endl;}

        string &operator=(string &;
};

string &string:perator = (string &s)
{
        if(this==&s) return *this;
        delete ptr;
        ptr=new char[strlen(s.ptr)+1];
        strcpy(ptr,s.ptr );
        return *this;
}
int main()
{
        string p1("chen";
        {
                string p2("    ";
                p2=p1;
                cout<<"p2:";
                p2.print();
        }

        cout<<"p1:";
        p1.print() ;
        return 0;
}

将string &operator=(string &;改为string operator=(string &;
将string &string:perator = (string &s)
{
        if(this==&s) return *this;
        delete ptr;
        ptr=new char[strlen(s.ptr)+1];
        strcpy(ptr,s.ptr );
        return *this;
}
改为string string:perator = (string &s)
{
        if(this==&s) return *this;
        delete ptr;
        ptr=new char[strlen(s.ptr)+1];
        strcpy(ptr,s.ptr );
        return *this;
}
运行结果为什么不一样呢?

论坛徽章:
0
2 [报告]
发表于 2007-01-07 13:45 |只看该作者
1. 代码里太多笑脸了,请用[code]……[/code]把它包越来
2. 看见你自己的类与标准库中的string类同名,不好的命名,容易与库冲突,建议改为如MyString的名字

论坛徽章:
0
3 [报告]
发表于 2007-01-07 13:48 |只看该作者
  1. 请问这个代码中:
  2. #include<iostream.h>
  3. #include<string.h>
  4. class string{
  5.         char *ptr;
  6. public:
  7.         string (char *s)
  8.         {ptr=new char[strlen(s)+1];
  9.         strcpy(ptr,s);
  10.         }
  11.         ~string()
  12.         {delete ptr;}

  13.         void print()
  14.         {cout<<ptr<<endl;}

  15.         string &operator=(string &;
  16. };

  17. string &string:perator = (string &s)
  18. {
  19.         if(this==&s) return *this;
  20.         delete ptr;
  21.         ptr=new char[strlen(s.ptr)+1];
  22.         strcpy(ptr,s.ptr );
  23.         return *this;
  24. }
  25. int main()
  26. {
  27.         string p1("chen";
  28.         {
  29.                 string p2("    ";
  30.                 p2=p1;
  31.                 cout<<"p2:";
  32.                 p2.print();
  33.         }

  34.         cout<<"p1:";
  35.         p1.print() ;
  36.         return 0;
  37. }

  38. 将string &operator=(string &;改为string operator=(string &;
  39. 将string &string:perator = (string &s)
  40. {
  41.         if(this==&s) return *this;
  42.         delete ptr;
  43.         ptr=new char[strlen(s.ptr)+1];
  44.         strcpy(ptr,s.ptr );
  45.         return *this;
  46. }
  47. 改为string string:perator = (string &s)
  48. {
  49.         if(this==&s) return *this;
  50.         delete ptr;
  51.         ptr=new char[strlen(s.ptr)+1];
  52.         strcpy(ptr,s.ptr );
  53.         return *this;
  54. }
  55. 运行结果为什么不一样呢?
复制代码

论坛徽章:
0
4 [报告]
发表于 2007-01-07 13:50 |只看该作者

回复 2楼 tyc611 的帖子

发表于: 2007-1-7 13:45    主题:   [引用]  [投诉] [快速回复]  


--------------------------------------------------------------------------------
跟标准库中的string类没有冲突的

论坛徽章:
0
5 [报告]
发表于 2007-01-07 14:02 |只看该作者
原帖由 xnec 于 2007-1-7 13:50 发表
发表于: 2007-1-7 13:45    主题:   [引用]  [投诉] [快速回复]  


--------------------------------------------------------------------------------
跟标准库中的string类没有冲突的

哎,建议你不听也罢,我是说容易出现问题!

还是回到你的问题上:
1. delete [] ptr; 释放数组
2. 你的第二个operator由于返回的是一个对象(不是引用),它会调用拷贝构造函数来构造这个临时对象。由于你没有定义拷贝构造函数,所以默认的就是浅拷贝(即新的对象只是复制那个字符指针的值,即两个对象的字符指针指向同一个字符串),而你的析构函数却要去释放那个指针。这样在对象析构时就可能释放那个指针两次,就发生错误了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP