如何在 C++ 中为 2 个指针变量创建复制构造函数?

问题描述

我有两个指针变量作为数据成员。如何制作这两个数据成员的副本?如何为此制作深拷贝构造函数?我尝试了很多次,但它不起作用。

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;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...