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