拷贝构造函数遇到指针的问题
时间: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;
#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(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;
{
//方法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();
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次构造函数
}
// 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次构造函数
}
相关阅读 更多 +