问题描述
我有两个指针变量作为数据成员。如何制作这两个数据成员的副本?如何为此制作深拷贝构造函数?我尝试了很多次,但它不起作用。
class abc {
float *number1;
float *number2;
public:
abc(float l,float w)
{
number1 = new float;
number2 = new float;
number1 = &l;
number2 = &w;
}
float get_1()
{
return *number1;
}
float get_2()
{
return *number2;
}
abc(const abc& ob)
{
number1 = ob.number1;
number2 = ob.number2;
}
void display()
{
cout << "Number 1 : " << *number1 << endl;
cout << "Number 2 : " << *number2 << endl;
}
};
解决方法
你的构造函数也是错误的:
abc(float l,float w)
{
number1= new float;
number2=new float;
number1 =&l; //this will overwrite the pointer returned by new with the address of a local variable
number2=&w; //the same
}
你应该这样做:
abc(float l,float w)
{
number1= new float(l); // allocate a float and set the value to l
number2=new float(w); // allocate a float and set the value to w
}
和复制构造函数很相似:
abc(const abc& ob)
{
number1 = new float(*ob.number1); // allocate a float and set the value to number1 from the other object
number2 = new float(*ob.number2); // allocate a float and set the value to number2 from the other object
}
这个例子可以通过使用构造函数的初始化列表进一步改进:
abc(float l,float w) :
number1 { new float(l)},number2 { new float(w)}
{
}
abc(const abc& ob) :
number1 { new float(*ob.number1)},number2 { new float(*ob.number2)}
{
}
,
对于初学者来说这个构造函数
abc(float l,float w)
{
number1 = new float;
number2 = new float;
number1 = &l;
number2 = &w;
}
产生内存泄漏。最初在这些语句中分配了一块内存
number1 = new float;
number2 = new float;
及其地址被分配给指针。但随后立即重新分配了指针
number1 = &l;
number2 = &w;
因此分配的内存的地址丢失了。
构造函数至少可以这样看
abc( float l,float w ) : number1( new float( l ) ),number2( new float( w ) )
{
}
这些功能
float get_1()
{
return *number1;
}
float get_2()
{
return *number2;
}
应该声明为
float get_1() const
{
return *number1;
}
float get_2() const
{
return *number2;
}
一般来说,最好像这样定义这些函数
const float & get_1() const
{
return *number1;
}
const float & get_2() const
{
return *number2;
}
float & get_1()
{
return *number1;
}
float & get_2()
{
return *number2;
}
复制构造函数看起来像
abc( const abc &ob)
: number1( new float( *ob.number1 ) ),number2( new float( *ob.number2 ) )
{
}
功能显示至少应该像
void display() const
{
cout << "Number 1 : " << *number1 << endl;
cout << "Number 2 : " << *number2 << endl;
}
你可以定义一个友元运算符
class abc
{
//...
friend std::ostream & operator <<( std::ostream &os,const abc &ob )
{
os << "Number 1 : " << *ob.number1 << std::endl;
os << "Number 2 : " << *ob.number2 << std::endl;
return os;
}
}
您还应该明确定义复制赋值运算符和析构函数。
,void display()
{
cout<<"Number 1 : "<<number1<<endl;
cout<<"Number 2 :"<<number2<endl;
}
这将打印数字在内存中的位置。那是你要的吗?显示数字的值
void display()
{
cout<<"Number 1 : "<< *number1 << endl;
cout<<"Number 2 : "<< *number2 << endl;
}