类里面的赋值和拷贝函数
** 明确一个问题:拷贝与赋值的区别**
A a, c;
A b = a;//显式复制构造函数,等效于A b(a);将内存中的一段区域初始化为一个类对象
c = a;//赋值函数,空间已经分配,只是进行赋值
** 构造、析构、复制、赋值四个函数,若没有显式的定义,系统会默认的建立一个隐式的函数**
class CTest
{
public:
CTest();
~CTest();
CTest(const CTest &);
void operator=(const CTest &);
};
- 系统默认的复制构造函数,只是浅拷贝,只是简单的将字段复制过去,一般情况下是够用的,如果类里面涉及到动态分配内存空间(有指针),则需要手动写一个深拷贝,(访问冲突和多次delete)详细的参考转载文章
- 若想禁用类的复制和赋值的功能,可以将复隐式的赋值+复制函数显式的放在private下面,如要连友元的一起禁用掉,则只放它们的函数声明(没有数据块{},编译的时候会报错)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//Test不支持复制和赋值。所以不能放入vector
class Test
{
public:
Test() {}
private:
//设为私有,禁用了Test的复制和赋值能力
Test(const Test &); //用于复制
void operator=(const Test &); //用于赋值
};
int main(int argc, const char *argv[])
{
vector<Test> vec;
Test t;
vec.push_back(t);
return 0;
}