类里面的赋值和拷贝函数<<0922

类里面的赋值和拷贝函数

** 明确一个问题:拷贝与赋值的区别**

      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;
 }
  

原文地址:https://www.cnblogs.com/sunstars/p/3990721.html