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

来源:互联网 发布:茅台迎宾酒淘宝店 编辑:程序博客网 时间:2024/05/21 17:12
 想必大家都知道在以下三种情况会调用拷贝构造函数:
 
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次构造函数
 
}
阅读(883) | 评论(0) | 转发(0) |
0

上一篇:C语言常见的几个排序

下一篇:UNIX下c语言的图形编程

相关热门文章
  • 网店代办货源网推举,各行各业...
  • 开网店的友人留神了 淘宝又现...
  • 开网店若何处置“问题买卖”_...
  • 开网店技能 淘宝店肆客服子帐...
  • 都是免费推广网店,新手上路必...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • ChinaUnix & ITPUB社区12周年...
  • ssh连接出现以下提示,求解...
  • 如何扩展MYSQL
  • 准备做一个大型门户,用户什么...
  • gbk or utf8
给主人留下些什么吧!~~
原创粉丝点击