c++ - 复制构造函数的调用

标签 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; 行必须调用复制构造函数。

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

m_aObject = local_obj1; 行是否真正调用了复制构造。 ?

如果我尝试调用复制构造。通过 m_aObject(local_obj1);, 它给出了编译错误 error: no match for call to '(A) (A&)'

对于上述情况,是否有任何其他方式调用复制构造函数。

最佳答案

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

type name = some_value;

另一个是复制赋值,当你有

name = some_value;

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

关于c++ - 复制构造函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40474586/

相关文章:

c++ - 显式复制构造函数和统一初始化

c++ - 复制构造动态分配对象的问题

c++ - 将数组声明为静态不会使程序崩溃

c++ - 枚举或宏。哪个更好

C++错误: C2280- compiler error that references deleted function?

java - 构造函数中对共享静态变量的访问是否需要同步?

c++ - 在复制构造函数和赋值运算符中删除私有(private)数组

c++ - boost::asio::ip::tcp::resolver::resolve() 永远阻塞

c++ - 将 900 MB .csv 转换为 ROOT (CERN) TTree

c++ - 为什么 atomic_flag 默认构造函数未指定状态?