• C++拷贝构造函数、移动拷贝函数


    在这里插入图片描述
    拷贝构造函数也是构造函数,所以一但声明,默认构造函数就失效了

    1、单一构造函数
    • 是指只有一个参数的构造函数,C++中可以用此类型隐式转换为该类
    class Str{
    
    Str(int a){
    }
    
    fun(Str x){
    }
    }
    
    int main(){
     //隐式转换
     Str x = 1;
     //隐式转换
     x.fun(2);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 如果不想被隐式转换,则可以加上explicit关键字
    class Str{
    
    explicit Str(int a){
    }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2、拷贝构造函数:接收一个当前类对象的构造函数
    • 会在涉及到拷贝初始化的场景被调用,比如:参数传递。因此要注意拷贝构造函数的形参类型
    class Str{
    
    Str() = default;
    //默认拷贝构造函数
    //Str(const Str&) = default;
    //自定义拷贝构造函数
    Str(const Str& a){
       //
    }
    }
    
    
    int main(){
    //使用默认的无参构造函数初始化
    Str a;
    //使用拷贝构造函数初始化
    Str b(a);
    //使用拷贝构造函数初始化
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 如果提供拷贝构造函数,则系统会自动生成,自动生成的拷贝构造函数会调用各个成员的拷贝构造函数进行拷贝,如果没有,系统则会报错。
    3、移动构造函数(C++11)

    接收一个当前类右值引用对象的构造函数,它的出现是为了方便程序使用,同时更好的优化速度,移动构造函数移动数据到另一个变量,速度很快,应该就是换了个名字继续用,但是原先的变量就失效了,这个和引用有区别。

    class Str{
    
    Str() = default;
    //拷贝构造函数
    Str(const Str&) = default;
    
    //默认的移动构造函数,注意这里没有const
    Str(Str&&) = default;
    //自定义的移动构造函数,注意这里没有const
    Str(Str&& a){
    }
    }
    
    int main(){
    
    Str a;
    
    //调用移动构造函数
    //注意当没有移动构造函数时,会调用拷贝构造函数
    //当既没有移动构造,也没有拷贝构造时,则会自己合成一个默认的移动构造函数,
    //默认的移动构造函数会调用每个成员的移动构造函数
    Str b = std::move(a);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 通常移动构造函数会被声明为不可抛出异常的函数,这一点也不是很重要,就是加上noexcept
    • 注意右值引用对象用作表达式时是左值
      有点绕口,其实就是说当数据传进去之后,你可以像普通左值变量一样使用
    class Str{
    
    Str() = default
    //,注意这里没有const
    void fun(Str && data){
         
         //这里data可以直接像普通左值变量一样使用
         std::cout << data.x << std::endl;
    }
    
    public:
    int x;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    数据挖掘-KNN算法+sklearn代码实现(六)
    vue2(1)
    第十三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure的Face API开发人脸识别门禁系统经典案例
    医疗软件制造商如何实施静态分析,满足 FDA 医疗器械网络安全验证
    源码分析:深入了解 equals、 ==、 hashcode
    vue2项目搭建结构
    小米应用商店如何做优化?有哪些方式 ?
    腾讯mini项目-【指标监控服务重构】2023-08-12
    使用go开发的小tips
    小咖批量剪辑助手款视频批量自动剪辑软件
  • 原文地址:https://blog.csdn.net/windxf/article/details/127422903