记录----有关C++继承以及移动构造函数报错

c++继承

有关c++继承,public、private、protected的区别:link


类的各种构造函数

//默认构造
//CAnyTest();//该构造函数不显式写出来
 
//普通无参构造函数
CAnyTest();
 
//普通有参数构造函数
CAnyTest(int nValue);
CAnyTest(int nValue = 0);// 不能于无参构造同时使用,二义性
 
//拷贝构造函数
CAnyTest(CAnyTest&);
CAnyTest(const CAnyTest&);
 
//移动构造函数
AnyTest(const CAnyTest &&);
 
//拷贝赋值构造函数
CAnyTest& operator=(const CAnyTest&);// return *this
 
//移动赋值构造函数
CAnyTest& operator=(const CAnyTest&&);// return *this

介绍拷贝构造函数、移动构造函数、拷贝赋值构造函数、移动赋值构造函数

1.拷贝构造函数和移动构造函数

总的来说,都是用一个已有的对象去创建构造一个新的对象。
当对象中含有指针或类作为数据成员的,对于已有的对象在构造出新的对象后,仍需要对该已有对象进行引用或 利用的,需要我们自己定义拷贝构造函数(进行深拷贝)。
而对于已有的对象在构造出新的对象后,将不再对该已有对象进行引用或利用的,需要我们自己定义移动构造函数(进行浅拷贝)。
拷贝构造函数和移动构造函数调用规则可以按下图进行:
图1-1 拷贝构造函数和移动构造函数的简单调用规则图

2.拷贝赋值函数和移动赋值函数

对于拷贝赋值和移动赋值,则都是用一个已有对象将其值赋值给另一个已有对象。

其调用赋值函数类型的规则与拷贝构造函数和移动构造函数调用规则相似,都是根据对象是否继续进行利用选择,调用规则可以按下图1-2进行:
在这里插入图片描述
首先看拷贝构造函数:

//拷贝构造函数
A(A& t)
{
    if(t.text!=NULL)
    {
        int len=strlen(t.text);
        text=new char[len+1];  //拷贝函数开辟了新内存空间
        strcpy(text,t.text);
    }
}

拷贝构造函数中实现了深拷贝处理。再看移动构造函数:

//移动构造函数
A(A&& t)
{
    if(t.text!=NULL)
    {
        text=t.text;
        t.text=NULL;
    }
} 

代码构造和拷贝构造函数类似,但是内存的处理不是拷贝而是转移。注意参数类型是右值引用。
移动赋值运算符
赋值运算符的情况和构造函数类似,还是先考察普通的赋值运算符:

//拷贝赋值运算符
A& operator=(const A& rhs)
{
    if(this!=&rhs)
    {
        free();
        if(rhs.text!=NULL)
        {
            int len=strlen(rhs.text);
            text=new char[len+1];
            strcpy(text,rhs.text);
        }
    }
    return *this;
}

再看移动赋值运算符:

//移动赋值运算符
A& operator=(A&& rhs)noexcept
{
    if(this!=&rhs)
    {
        free();
        text=rhs.text;
        rhs.text=NULL;
    }
    reeturn *this;
}

关于error: use of deleted function 'std::mutex::mutex(const std::mutex&)'的报错

std :: mutex 既不可复制也不可移动。在你的类中包含一个mutex,会导致你的类变成不可复制(可移动)。如果你希望你的类是可复制的或可移动的,你必须告诉编译器你的类的对象是如何被复制或移动通过自己实现复制/移动构造/赋值。
最好的方法是将std :: mutex定义在一个不需要复制移动的类中

ps.这里我用了vector<obj> ,obj中定义了一个std::mutex ,在进行for循环push的时候发生了这个报错。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++面向对象编程中,构造函数和析构数是两个非常重要的概念。 构造函数是一种特殊的数,它在对象被创建时自动调用,用于初始化对象的数据成员。构造函数的名称与类名相同,没有返回值类型,可以有参数,可以有多个构造函数,以便在创建对象时进行不同的初始化操作。 析构数是一种特殊的数,它在对象被销毁时自动调用,用于清理对象的资源。析构数的名称与类名相同,前面加上一个波浪号(~),没有返回值类型,不接受任何参数构造函数和析构数是C++面向对象编程中的两个重要概念,它们的作用是初始化对象和清理对象的资源,是面向对象编程的基础。 ### 回答2: 面向对象是一种程序设计的方法,它以对象为中心,通过封装、继承和多态等机制来组织和管理代码,使程序更加可靠、可重用和易于维护。其中,构造函数和析构数是面向对象程序设计中的重要概念。 构造函数是一种特殊的成员数,它在对象创建时自动被调用,用于对对象进行初始化。构造函数的名称与类名相同,没有返回值,可以重载,可以带参数,也可以不带参数构造函数的作用是保证对象在创建时始终处于一种可靠的状态,从而避免程序运行时的错误和异常。 析构数是与构造函数相对应的一种成员数,它在对象销毁时自动被调用,用于对对象进行善后处理。析构数的名称与类名相同,前面加上一个波浪号(~),没有参数,也没有返回值。析构数的作用是释放对象所占用的资源,例如动态分配的内存、打开的文件、建立的连接等,在对象销毁之前要确保这些资源已经被回收,从而避免内存泄漏和资源浪费。 构造函数和析构数是面向对象程序设计中的重要组成部分,它们体现了对象的生命周期和和管理方式,尤其是在涉及到动态内存分配和释放时更为重要。正确使用构造函数和析构数可以提高程序的可靠性、可重用性和可维护性,从而更好地实现程序模块化和复用。因此,在面向对象程序设计中,构造函数和析构数应该被视为重要的设计关注点,特别是在涉及到大型程序或长期运行的系统时。 ### 回答3: 面向对象编程是一种广泛使用的编程范式,它关注的是对象的行为和属性,而不是数和逻辑。构造函数和析构数是面向对象编程中的两个重要概念,在类的实例化和释放过程中起到了关键的作用。 构造函数是一个类的特殊数,它习惯性地与类名相同,用于初始化类的实例。构造函数可以接收参数,这些参数可以用来初始化类的成员变量。每当一个新的对象被创建时,构造函数会自动调用,以确保对象被正确地初始化。如果类没有定义构造函数,编译器将提供一个默认构造函数。 析构数是一个类的另一个重要数,它也习惯性地与类名相同,用于释放由该类创建的资源。析构数通常用于释放内存、关闭打开的文件、关闭网络连接等等,以防止资源泄漏和造成程序崩溃。当一个对象被删除或销毁时,析构数会自动调用,以确保类能够正确地清理资源。 需要注意的是,当一个对象被复制时,也会调用构造函数和析构数。使用深拷贝和浅拷贝来管理类的复制,以确保不会复制对象的私有数据。此外,有一些 C++ 特殊语法,如移动语义和智能指针等等,可以用于提高构造函数和析构数的效率和安全性。 总之,构造函数和析构数是面向对象编程中不可或缺的两个概念。它们可以保证类的正确初始化和释放,从而防止资源泄漏和程序崩溃。编写好构造函数和析构数是编写高质量 C++ 代码的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值