1 C++拷贝构造函数

1.1 拷贝构造函数的含义与形式

C++的拷贝构造函数与构造函数不同,其作用主要是实现从源类对象到目标类对象逐个字节的复制,即目标对象和源对象都等于源对象的值。

C++中类的拷贝构造函数(赋值构造函数)的常用的形式如下

类名(const 类名& exp)

比如我们写一个Example类,那么它的构造函数、析构函数、拷贝构造函数如下所示

class Example
{
public:
    Example()
    {
        std::cout << "构造函数" << std::endl;
    }

    virtual~Example()
    {
        std::cout << "析构函数" << std::endl;
    }

    Example(const Example& exp)
    {
        std::cout << "拷贝构造函数" << std::endl;
    }
};

那么是什么时候会调用类的拷贝构造函数呢?

1.2 调用类的拷贝构造函数的几种情况

在以下几种情况下会调用类的拷贝构造函数:

  • 当使用某类的一个对象初始化该类的另一个对象(引用)时会自动调用拷贝构造函数;
  • 当一个函数的形参为一个类的对象时,会自动调用拷贝构造函数;
  • 当一个函数的返回值为一个类的对象时,会自动调用拷贝构造函数;

1.2.1 当使用某类的一个对象初始化该类的另一个对象(引用)时

示例代码如下:

#include <iostream>

class Example
{
public:
    Example()
    {
        std::cout << "构造函数" << std::endl;
    }

    virtual~Example()
    {
        std::cout << "析构函数" << std::endl;
    }

    Example(const Example& exp)
    {
        std::cout << "拷贝构造函数" << std::endl;
    }
};


int main()
{
    Example example_a;
    Example example_b(example_a);

    return 0;
}

输出

构造函数
拷贝构造函数
析构函数
析构函数

1.2.2 当一个函数的形参为一个类的对象时

示例代码如下

#include <iostream>

class Example
{
public:
    Example()
    {
        std::cout << "构造函数" << std::endl;
    }

    virtual~Example()
    {
        std::cout << "析构函数" << std::endl;
    }

    Example(const Example& exp)
    {
        std::cout << "拷贝构造函数" << std::endl;
    }
};

void func(Example a)
{
    std::cout << "enter void func(Example a)" << std::endl;
}


int main()
{
    Example example_a;

    func(example_a);

    return 0;
}

输出结果

构造函数
拷贝构造函数
enter void func(Example a)
析构函数
析构函数

1.2.3 当一个函数的返回值为一个类的对象时

示例代码如下

#include <iostream>

class Example
{
public:
    Example()
    {
        std::cout << "构造函数" << std::endl;
    }

    virtual~Example()
    {
        std::cout << "析构函数" << std::endl;
    }

    Example(const Example& exp)
    {
        std::cout << "拷贝构造函数" << std::endl;
    }
};

Example copy_return()
{
    Example temp;
    return temp;
}

int main()
{
    Example example_a;
    Example example_copy = copy_return();

    return 0;
}

输出结果

构造函数
构造函数
拷贝构造函数
析构函数
析构函数
析构函数