文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>拷贝构造函数遇到指针的问题

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

时间:2010-10-13  来源:huabinbin00

 想必大家都知道在以下三种情况会调用拷贝构造函数:  
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次构造函数
 
}
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载