Chinaunix首页 | 论坛 | 博客
  • 博客访问: 501224
  • 博文数量: 92
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 2314
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-27 10:20
文章分类

全部博文(92)

文章存档

2014年(3)

2013年(17)

2012年(16)

2011年(22)

2010年(34)

分类: C/C++

2010-10-13 18:24:59

 想必大家都知道在以下三种情况会调用拷贝构造函数:
 
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"<
    }

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

 
    String operator = (const String & s2)  //operator=是函数名  // 得分点:输入参数为const型
 {  
        //方法2 可以
  cout<<"==="<  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< }
 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次构造函数
 
}
阅读(1800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~