C++专题:拷贝构造函数
1. 有何功能
- 拷贝构造函数的功能:将一个对象复制到新创建的对象中。
- 拷贝构造函数的原型:
Class_name(const Class_name &)
2. 何时调用
1)对一个object做显示的初始化操作时,2)当object被当做参数交给某个函数时,3)当函数传回一个class object时
--摘自《深入探索C++对象模型》
3. 实例验证
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "call default constructor" << endl;
}
A(const A& a) {
cout << "call copy constructor" << endl;
}
~A() {
cout << "call destructor" << endl;
}
};
3.1. 对一个object做显示初始化
int main() {
A a; // 调用默认构造函数
A b = a; // 调用拷贝构造函数
return 0;
}
预期输出:
call default constructor
call copy constructor
call destructor
call destructor
实际输出:
call default constructor
call copy constructor
call destructor
call destructor
结论:符合预期
3.2. 当object被当做参数交给某个函数时
void test_default(A a)
{
cout << "call test_default" << endl;
}
int main() {
A a; // 调用默认构造函数
test_default(a); // 调用拷贝构造函数
return 0;
}
预期输出:
call default constructor
call copy constructor
call test_default
call destructor
call destructor
实际输出:
call default constructor
call copy constructor
call test_default
call destructor
call destructor
结论:符合预期
3.3. 当函数传回一个class object时
A test_copy()
{
A a;
cout << "call test_copy" << endl;
return a;
}
int main() {
A a = test_copy();
return 0;
}
预期输出:
call default constructor
call copy constructor
call test_copy
call destructor
call destructor
实际输出:
call default constructor
call test_copy
call destructor
结论: 不符合预期!!!那么问题来了,这里为什么没有调用拷贝构造函数?
一开始我也愣住了,书上明明白纸黑字写着,想了半天开始怀疑自己的代码问题。想了好久,猛地想起编译器优化,在《深入探索C++对象模型》第2章的”在编译器层面做优化“中有所涉及,即NRV优化。test_copy函数会被改写成以下代码:
void test_copy(A& _a) {
// 默认构造函数被调用
_a.A::A();
return;
}
而主函数针对test_copy的调用:
A a = test_copy();
经过编译器优化之后,被转换成:
A a; // 这里并没有调用默认构造函数初始化
test_copy(a);

浙公网安备 33010602011771号