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);
posted @ 2020-10-28 22:47  Jgirl  阅读(133)  评论(0)    收藏  举报