C++ 为什么调用复制构造函数?
C++ Why was the copy constructor called?
class A {
public:
A() {}
A(const A& a) { cout << "A::A(A&)" << endl; }
};
class B {
public:
explicit B(A aa) {}
};
int main() {
A a;
B b(a);
return 0;
}
为什么打印 "A::A(A&)"?
"A" 的复制构造函数是什么时候调用的?如果代码调用复制构造函数,为什么我可以删除复制构造函数而不产生编译错误?
为什么会发生复制
看看你的 class B
客户:
class B {
public:
explicit B(A aa) {}
};
您收到 值 的 A,在通话期间触发复制。
如果您将其更改为(注意 A & aa
):
class B {
public:
explicit B(A & aa) {}
};
不会有任何副本...
默认复制构造函数
当您删除 c'tor 时,编译器会在它可以简单地这样做时为您生成一个:
First, you should understand that if you do not declare a copy
constructor, the compiler gives you one implicitly. The implicit
copy constructor does a member-wise copy of the source object.
默认的 c'tor 等同于:
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ) {}
B(A aa)
接受一个 A
的值,所以当你执行 B b(a)
时,编译器调用复制构造函数 A(const A& a)
来生成 A
的实例在 B
.
的 explicit
构造函数中命名为 aa
您可以删除复制构造函数并使其仍然有效的原因是,如果您还没有声明移动构造函数,编译器将为您生成一个复制构造函数。
注意:编译器生成的拷贝构造函数对于复杂的 类 通常是不够的,它执行简单的成员明智的拷贝,所以对于复杂的元素或动态分配的内存你应该声明你自己的.
§ 15.8.1
If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly.
If the class definition declares a move constructor or move assignment operator, the implicitly declared copy
constructor is defined as deleted; otherwise, it is defined as defaulted (11.4). The latter case is deprecated if
the class has a user-declared copy assignment operator or a user-declared destructor or assignment operator.
class A {
public:
A() {}
A(const A& a) { cout << "A::A(A&)" << endl; }
};
class B {
public:
explicit B(A aa) {}
};
int main() {
A a;
B b(a);
return 0;
}
为什么打印 "A::A(A&)"?
"A" 的复制构造函数是什么时候调用的?如果代码调用复制构造函数,为什么我可以删除复制构造函数而不产生编译错误?
为什么会发生复制
看看你的 class B
客户:
class B {
public:
explicit B(A aa) {}
};
您收到 值 的 A,在通话期间触发复制。
如果您将其更改为(注意 A & aa
):
class B {
public:
explicit B(A & aa) {}
};
不会有任何副本...
默认复制构造函数
当您删除 c'tor 时,编译器会在它可以简单地这样做时为您生成一个:
First, you should understand that if you do not declare a copy constructor, the compiler gives you one implicitly. The implicit copy constructor does a member-wise copy of the source object.
默认的 c'tor 等同于:
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ) {}
B(A aa)
接受一个 A
的值,所以当你执行 B b(a)
时,编译器调用复制构造函数 A(const A& a)
来生成 A
的实例在 B
.
explicit
构造函数中命名为 aa
您可以删除复制构造函数并使其仍然有效的原因是,如果您还没有声明移动构造函数,编译器将为您生成一个复制构造函数。
注意:编译器生成的拷贝构造函数对于复杂的 类 通常是不够的,它执行简单的成员明智的拷贝,所以对于复杂的元素或动态分配的内存你应该声明你自己的.
§ 15.8.1
If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (11.4). The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor or assignment operator.