本文将对C++类中的默认构造函数,带参构造函数,移动构造函数拷贝构造函数(复制构造函数),赋值运算符,移动赋值运算符等的特殊成员函数基本用法和基础语法进行简要的介绍和总结。

1 C++类常用的特殊成员函数

1.1 类的默认构造函数

默认构造函数是不需要实参就可以调用的构造函数。

1.2 类的拷贝构造函数(复制构造函数)

当对象从同类型的类一对象直接初始化或者复制初始化时会调用拷贝构造函数。

1.3 类的移动构造函数

当从同类型类对象的右值初始化对象时会调用移动构造函数。

1.4 类的赋值运算符函数

当类对象被同一类型对象直接使用操作符=时会调用类的赋值运算符函数。

1.5 类的移动赋值运算符函数

当类对象被同意类型对象的右值直接使用操作符=时会调用类的移动赋值运算符函数。

1.6 类的析构函数

析构函数是对象终结时调用的特殊成员函数。析构函数的目的是释放对象可能在其生存期间获得的资源。

2 一个完整的C++类特殊成员函数编写示例

#include <iostream>

class Point
{
public:
    Point():m_X(0.0),m_Y(0.0),m_Z(0.0)
    {
        std::cout << "默认构造函数" << std::endl;
    }

    Point(float x, float y, float z):m_X(x),m_Y(y),m_Z(z)
    {
        std::cout << "带参构造函数" << std::endl;
    }

    Point(Point&& point):m_X(std::move(point.m_X)), m_Y(std::move(point.m_Y)), m_Z(std::move(point.m_Z))
    {
        std::cout << "移动构造函数" << std::endl;
    }

    Point(const Point& point)
    {
        std::cout << "拷贝构造函数(赋值构造函数)" << std::endl;
        this->m_X = point.m_X;
        this->m_Y = point.m_Y;
        this->m_Z = point.m_Z;
    }

    Point& operator= (const Point& point)
    {
        std::cout << "拷贝赋值运算符" << std::endl;
        this->m_X = point.m_X;
        this->m_Y = point.m_Y;
        this->m_Z = point.m_Z;
        return *this;
    }

    Point& operator=(Point&& point)
    {
        std::cout << "移动赋值运算符" << std::endl;
        m_X = std::move(point.m_X);
        m_Y = std::move(point.m_Y);
        m_Z = std::move(point.m_Z);

        return *this;
    }


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

    void Print()
    {
        std::cout << m_X << " " << m_Y << " " << m_Z << std::endl << std::endl;
    }

private:
    float m_X;
    float m_Y;
    float m_Z;
};


int main()
{
    // 调用默认构造函数
    Point temp_point1;
    temp_point1.Print();

    // 调用带参构造函数
    Point temp_point2(1.0,1.5,2.0);
    temp_point2.Print();

    // 调用移动构造函数
    Point temp_point3 = std::move(temp_point2);
    temp_point3.Print();

    // 调用拷贝构造函数
    Point temp_point4 = temp_point3;
    temp_point4.Print();

    // 调用拷贝赋值运算符
    temp_point1 = temp_point4;
    temp_point1.Print();

    // 调用移动赋值运算符
    temp_point1 = std::move(temp_point2);
    temp_point1.Print();
}

结果:

默认构造函数
0 0 0

带参构造函数
1 1.5 2

移动构造函数
1 1.5 2

拷贝构造函数(赋值构造函数)
1 1.5 2

拷贝赋值运算符
1 1.5 2

移动赋值运算符
1 1.5 2

析构函数
析构函数
析构函数
析构函数