拷贝构造函数遇到指针的问题

 想必大家都知道在以下三种情况会调用拷贝构造函数:
 
q 将某个对象初始化为类的另一个对象时 
q 将对象当作参数传递给函数时
q 函数返回对象时
但是在类中我们申明一个指针属性的时候,我是在构造函数里用new分配空间,在析构函数释放空间。在main()里调用
 类名 对象名(另一个对象名);//符合第一条
 
String s2(s1);s2.display();    // 执行有问题
 运行的时候发觉指针异常,即段错误。
 这是因为在调用拷贝构造函数的时候
赋值函数仅复制指针而非字符串,除S2后,内存被释放,但对象S1的str仍指向它。
请看完整的代码:
 
#include "iostream.h"
#include "string.h"

class String
{
public:
 int len;
 char *str;
public:
    String(int l=0,char *s="")  //构造函数
    {
       len=l;
       int length = strlen(s);
       str = new char[length+1];
       strcpy(str,s);
       cout<<"11111111111111"<<endl;
    }

 String(String const &s2)   //  复制构造函数,参数一定要用引用  为避免参数被意外修改,可在参数前加const
  //复制构造函数何时使用:1  将某个对象初始化为类的另一个对象时 
 { 
  cout<<"复制构造"<<endl;
  this->len=s2.len;         
  // this->str=s2.str;   //默认地址值相同
  
  int length = strlen(s2.str);//改造成地址值不同,但内容相同
  str = new char[length+1];
  strcpy(str,s2.str);
 }
  
 
 ~String(){
  cout<<"~"<<str<<endl;
  delete[] str;
  str=NULL;
  }  //析构函数
 

 
    String operator = (const String & s2)  //operator=是函数名  // 得分点:输入参数为const型
 {  
        //方法2 可以
  cout<<"==="<<endl;// s5=s5;
  if(this==&s2)
    return *this;   //2
  delete [] str;  //2
  this->len=s2.len;
  int length = strlen(s2.str); 
  str = new char[length+1];
  if(NULL==str)    //2
   return -1;
  strcpy(str,s2.str);
  return *this;   //得分点:返回本对象的引用 
  
 }
 
 void display()
 {
    cout<<str<<len<<endl;
 }
 String  fun()
 {
    return *this;  
 }
 void fun2(String S)  //String S=s1   ==String S(s1)
 {            
 }
 String fun3(String S)
 {              
   return *this;
 }
 
};
void main()
{
 String s1(20,"welcom");
 //s1.display();
 //String s2(s1);   //复制构造函数何时使用:1 将某个对象初始化为类的另一个对象时
 //s2.display();
 //String s5= s3.operator=(s1); //调用operator=函数和复制构造函数
 // String s5=s1;//只调用复制构造函数
 String s5;  //如果分成2行写,则调用operator=函数和复制构造函数
 s5=s1;//s1.str  s5.str
 //String s3;
 // s1.fun3(s3);    //复制构造函数何时使用:3 函数返回对象时
 //String s3=s1.fun();
  //s1.fun2(s1); //复制构造函数何时使用:2 将对象当作参数传递给函数时
 //   s3.fun3(s1);  //调用2次构造函数
 
}
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(883) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值