• 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

C++ – C++类的特殊成员函数,析构函数,拷贝构造函数,移动构造函数,赋值运算符,移动赋值运算符介绍和基础语法

C++ 发布于2022-03-07 阅读 2,565次 0次评论 0次点赞 本文共1738个字,阅读需要5分钟。

本文将对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

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

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – C++类的特殊成员函数,析构函数,拷贝构造函数,移动构造函数,赋值运算符,移动赋值运算符介绍和基础语法

原文链接:https://www.stubbornhuang.com/2000/

发布于:2022年03月07日 16:19:50

修改于:2023年06月26日 20:31:26

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
深度学习 - 深度学习中的多维数据存储方式NCHW和NHWC
深度学习
下一篇
Visual Studio - 借助远程Linux服务器环境在Visual Studio中编写和远程调试Linux C++程序
Visual Studio
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号