• 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
  • 相关阅读:
    第八章《Java高级语法》第5节:内部类
    Django 解决 CSRF 问题
    一次赌博-誉天RHCA学员学习分享
    认识微服务
    bestphp‘s revenge/ 安洵杯Babyphp(phpsession题目)
    带着问题去分析:Spring Bean 生命周期
    低版本浏览器使用最新渲染模式以免IE不支持CSS3属性
    OpenGL 绘制文本(QPainter)
    大促和日常控价的区别
    《深度学习进阶:自然语言处理》读书笔记:第3章 word2vec
  • 原文地址:https://blog.csdn.net/windxf/article/details/127422903