复制构造函数的调用
Invoking of 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;
}
根据 link [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&)'
对于上述情况,是否还有其他调用复制构造函数的方法。
m_aObject = local_obj1; // should invoke the copy constructor
没有。不应该。
它调用复制赋值运算符。您没有自定义实现。因此,编译器会为您生成一个。
参见What's the difference between assignment operator and copy constructor?。
将 =
与 类 一起使用时会发生两种情况。第一个是复制构造,看起来像
type name = some_value;
另一个是复制赋值,当你有
name = some_value;
如您所见,您的代码看起来像第二个示例,这意味着您使用的是赋值运算符而不是复制构造函数。请记住,只有在创建对象时才会调用构造函数。之后你只是 copy/move 分配。
在您的 class B 中,您有 class A 作为成员 在构造class B时初始化。由于成员 m_aObject 已经 初始化 (使用 A 的默认构造函数创建),因此不会调用复制构造函数。在您的情况下,默认赋值运算符是使用浅拷贝调用的。
作为参考,复制构造函数通常在以下情况下调用:
- 实例化一个对象并用另一对象的值初始化它。
- 按值传递对象
- 一个对象通过值从一个函数返回
我了解当基于现有对象创建新对象时会调用复制构造函数。但是我一直在尝试做同样的事情,但我发现没有调用复制构造函数。 以下是我的一段代码:
/*
* 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;
}
根据 link [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&)'
对于上述情况,是否还有其他调用复制构造函数的方法。
m_aObject = local_obj1; // should invoke the copy constructor
没有。不应该。
它调用复制赋值运算符。您没有自定义实现。因此,编译器会为您生成一个。
参见What's the difference between assignment operator and copy constructor?。
将 =
与 类 一起使用时会发生两种情况。第一个是复制构造,看起来像
type name = some_value;
另一个是复制赋值,当你有
name = some_value;
如您所见,您的代码看起来像第二个示例,这意味着您使用的是赋值运算符而不是复制构造函数。请记住,只有在创建对象时才会调用构造函数。之后你只是 copy/move 分配。
在您的 class B 中,您有 class A 作为成员 在构造class B时初始化。由于成员 m_aObject 已经 初始化 (使用 A 的默认构造函数创建),因此不会调用复制构造函数。在您的情况下,默认赋值运算符是使用浅拷贝调用的。
作为参考,复制构造函数通常在以下情况下调用:
- 实例化一个对象并用另一对象的值初始化它。
- 按值传递对象
- 一个对象通过值从一个函数返回