CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一个关于赋值操作符的问题

楼主wuboy2000(摇滚麦克)2004-05-04 20:54:01 在 C/C++ / C++ 语言 提问

有一程序:  
  #include<iostream.h>  
  #include<string.h>  
   
  class   string  
  {  
  private:  
  char   *   str;  
  public:  
  string(char   *   s="   ")  
  {  
  cout<<"在构造函数中\n";  
  int   size=strlen(s);  
  str=new   char[size+1];  
  strcpy(str,s);  
  }  
  ~string()  
  {  
  delete   str;  
  }  
  string&   operator=(string&   ss)  
  {  
  cout<<"赋值操作符\n";  
  delete   str;  
  str=new   char[strlen(ss.str)+1];  
  strcpy(str,ss.str);  
  return   *this;  
  }  
  void   showstring()  
  {  
  cout<<str<<endl;  
  }  
  };  
  void   main()  
  {  
  string   s1="内存中的字符串";  
  cout<<"s1=";  
  s1.showstring();  
  string   s2;  
  s2=s1;  
  cout<<"s2=";  
  s2.showstring();  
  }  
  我有几点不明白,在成员函数:  
  string&   operator=(string&   ss)  
  {  
  cout<<"赋值操作符\n";  
  delete   str;  
  str=new   char[strlen(ss.str)+1];  
  strcpy(str,ss.str);  
  return   *this;  
  }  
  中,为什么要delete   str;他删除的又是谁的str?  
  另外,这其实是个赋值操作符=的重载,那么里面strcpy(str,ss.str);中的str一定是指s2的吗? 问题点数:20、回复次数:10Top

1 楼cngdzhang()回复于 2004-05-04 21:00:08 得分 6

cout<<"赋值操作符\n";  
  delete   str;  
  str=new   char[strlen(ss.str)+1];  
  strcpy(str,ss.str);  
  return   *this;  
   
  是它自己的str,在构造函数中分配的空间  
  delete   str;  
  是因为它要从新分配空间  
  在从新分配空间之前,要把原先分配的释放掉  
   
   
  Top

2 楼cngdzhang()回复于 2004-05-04 21:02:43 得分 0

类中的非静态变量,  
  在类的每一个实例中都有自己的一份的  
  静态变量在整个类中只有一份  
  Top

3 楼cngdzhang()回复于 2004-05-04 21:04:50 得分 0

s2=s1;  
  在这里面str是s2的  
  如果是  
  s1=s2;  
  则是s1的  
  Top

4 楼Leung_(Vector)回复于 2004-05-04 22:53:20 得分 7

delete   str;  
   
  of   course   "str"   is   s2's   str.  
   
  we   should   use   this   because   s2   may   allocate   some   memory,   for   example:  
   
  string   s1   =   "abc";  
  string   s2   =   "efg";   //   here   s2   allocate   3   bytes   memory.  
   
  then   if:  
   
  s2   =   s1;  
   
  before   we   copy   s1.str   to   s2.str,   we   should   first   deallocate   the   3   bytes   otherwise   there   will   be   a   memory   leak.  
   
  You   can   find   many   many   such   topics   in   "Effective   C++".  
  Top

5 楼carambo(单叶草--(***实干才有好运***))回复于 2004-05-04 23:18:42 得分 0

进来学习.:)Top

6 楼wuboy2000(摇滚麦克)回复于 2004-05-06 14:48:55 得分 0

string   s2;  
  我在类中并没有编写不带参数的默认构造函数啊?为什么还会给s2初始化呢?  
  string(char   *   s="   ")  
  {  
  cout<<"在构造函数中\n";  
  int   size=strlen(s);  
  str=new   char[size+1];  
  strcpy(str,s);  
  }  
  这个不是带参数的构造函数吗?难道它能用来初始化s2?Top

7 楼freefalcon(心宇—消失中...)回复于 2004-05-06 14:56:02 得分 7

string(char   *   s="   ")  
  但你使用了缺省参数  
  默认构造函数的定义是:   不带参数,或者所有参数都使用了缺省参数Top

8 楼wuboy2000(摇滚麦克)回复于 2004-05-06 15:07:26 得分 0

参数使用了缺省参数,在这里可不可以理解为向使用了默认值一样?Top

9 楼freefalcon(心宇—消失中...)回复于 2004-05-06 15:09:48 得分 0

是的,缺省值的意思就是在未显示指定值的情况下而采用的默认值Top

10 楼wuboy2000(摇滚麦克)回复于 2004-05-06 15:14:37 得分 0

thanks!Top

相关问题

  • 小问题:C++ 重载赋值操作符的两种方式?
  • 征解:如何用c语言的位操作符来实现这样的逻辑判断和赋值
  • []操作符
  • []操作符
  • 增量操作符???
  • 关于"&"操作符
  • 操作符重载
  • 操作符重载
  • 关于操作符“ :”!
  • 操作符重载

关键词

  • include
  • char

得分解答快速导航

  • 帖主:wuboy2000
  • cngdzhang
  • Leung_
  • freefalcon

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo