调用复制构造函数

时间:2016-11-07 21:04:24

标签: c++ constructor copy-constructor

我知道在创建基于现有对象的新对象时会调用复制构造函数。但是我一直在尝试做同样的事情,我发现没有调用复制构造函数。 以下是我的代码:

/*
* class definition
*/
class A
{

  public:
     A(int mn, int mx); //default constructor
     A(A const& obj);  //copy constructor
     ~A();
  private:
    int* ptr;
    int max;
    int min;
}

class B
{
  public: 
      B();
      void print();
  private: 
      A m_aObject;
}


/*
* B.cpp
*/
void B::print()
{
    A local_obj1(2,3);
    local_obj1.ptr = Global_array; //some global array.
    m_aObject = local_obj1; // should invoke the copy constructor
}


/*
* A.cpp
*/
A::A(A const& obj)
{
   cout << "copy constr. invoked"<<endl;
   ptr = new int[10];
   for(int i= 0; i< 10; i++)
     ptr[i] = obj.ptr[i];       
}

A::A(int mx, int mn)
{
  min = mn;
  max = mx;
}

根据链接[https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm],行m_aObject = local_obj1;必须调用复制构造函数。

但是我看到在执行上述statemment之后,永远不会调用复制构造函数。复印件内的打印件。永远不会在控制台上显示。

m_aObject = local_obj1;是否真的调用了副本constr。 ?

如果我尝试调用copy constr。按m_aObject(local_obj1);, 它给出了编译错误error: no match for call to '(A) (A&)'

是否有其他方法可以为上述情况调用复制构造函数。

3 个答案:

答案 0 :(得分:3)

=与类一起使用时可能会发生两件事。第一个是复制构造,看起来像

type name = some_value;

另一种是复制分配,当你有

时就会发生这种情况
name = some_value;

正如您所看到的,您的代码看起来像第二个示例,这意味着您正在使用赋值运算符而不是复制构造函数。请记住,只有在创建对象时才会调用构造函数。之后,您只能复制/移动分配。

答案 1 :(得分:1)

  

m_aObject = local_obj1; //应该调用复制构造函数

没有。它不应该。

它调用复制赋值运算符。您没有自定义实现。因此,编译器会为您生成一个。

请参阅What's the difference between assignment operator and copy constructor?

答案 2 :(得分:0)

在您的 B类中,您将 A类作为初始化的成员 B类 STRONG>。由于成员m_aObject已经初始化(使用A的默认构造函数创建),因此不会调用复制构造函数。在您的情况下,使用浅拷贝调用默认赋值运算符。

作为参考,通常在以下时间调用复制构造函数:

  • 使用来自其他对象的值实例化一个对象并初始化
  • 按值传递对象
  • 通过值
  • 从函数返回一个对象