C++中类的6个默认成员函数 【拷贝构造函数】

2024-02-26 1608阅读

温馨提示:这篇文章已超过462天没有更新,请注意相关的内容是否还可用!

文章目录

    • 拷贝构造函数的使用
      • 拷贝构造对于自定义类型【浅拷贝】
      • 深拷贝
      • 拷贝构造函数典型调用场景

        拷贝构造函数的使用

        • 在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象

        • 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?

        • 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

          拷贝构造函数也是特殊的成员函数,其特征如下:

          1. 拷贝构造函数是构造函数的一个重载形式。
          2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
          class Date
          {
          public:
          	Date(int year = 1900, int month = 1, int day = 1)
          	{
          		_year = year;
          		_month = month;
          		_day = day;
          	}
          	//Date(const Date d) // 错误写法:编译报错,会引发无穷递归
          	Date(const Date& d) // 必须传引用
          	{
          		_year = d._year;
          		_month = d._month;
          		_day = d._day;
          	}
          private:
          	int _year;
          	int _month;
          	int _day;
          };
          int main()
          {
          	Date d1(2024,2,1);
          	Date d2(d1);
          	return 0;
          }
          

          C++中类的6个默认成员函数 【拷贝构造函数】

          • 下面我们解释一下:
          • 这里的const可加可不加,但是建议加上
          • 有些人就写这个写昏头了,写反了,不加const的话不会提示

            C++中类的6个默认成员函数 【拷贝构造函数】

            • 加上了就知道哪里错了,所以还是加上较好

              C++中类的6个默认成员函数 【拷贝构造函数】

              • 这里的拷贝构造必须传引用,要不然会引发无穷递归【反正编译会报错~】

                C++中类的6个默认成员函数 【拷贝构造函数】

                • 再看下面代码,我是没有写拷贝构造的,但是这里自动拷贝了,毕竟这个是默认成员函数,这里生成的还和之前几个的默认成员函数还不一样,之前的对默认成员函数对内置类型不处理,而这个拷贝构造对内置类型处理了,如果没有处理,这里就拷贝不出来
                • 说明这里会自动生成一个拷贝构造函数,将值拷贝回去
                  1. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
                  class Date
                  {
                  public:
                  	// 构造函数
                  	Date(int year = 2024, int month = 2, int day = 1)
                  	{
                  		_year = year;
                  		_month = month;
                  		_day = day;
                  	}
                  	void Print()
                  	{
                  		cout 
                  	Date d1(2024, 2, 1);
                  	Date d2(d1);
                  	
                  	d1.Print();
                  	d2.Print();
                  	return 0;
                  }
                  
                  public:
                  	Time(const Time& t)
                  	{
                  		_hour = t._hour;
                  		_minute = t._minute;
                  		_second = t._second;
                  		cout 
                  public:
                  	Date(int year = 2024, int month = 2, int day = 1)
                  	{
                  		_year = year;
                  		_month = month;
                  		_day = day;
                  	}
                  	void Print()
                  	{
                  		cout 
                  	Date d1(2024,2,1);
                  	Date d2(d1);
                  	
                  	d1.Print();
                  	d2.Print();
                  	return 0;
                  }
                  
                  public:
                  	Stack(size_t capacity = 10)
                  	{
                  		_array = (DataType*)malloc(capacity * sizeof(DataType));
                  		if (nullptr == _array)
                  		{
                  			perror("malloc申请空间失败");
                  			return;
                  		}
                  		_size = 0;
                  		_capacity = capacity;
                  	}
                  	void Push(const DataType& data)
                  	{
                  		// CheckCapacity();
                  		_array[_size] = data;
                  		_size++;
                  	}
                  	~Stack()
                  	{
                  		if (_array)
                  		{
                  			free(_array);
                  			_array = nullptr;
                  			_capacity = 0;
                  			_size = 0;
                  		}
                  	}
                  private:
                  	DataType* _array;
                  	size_t _size;
                  	size_t _capacity;
                  };
                  int main()
                  {
                  	Stack s1;
                  	s1.Push(1);
                  	s1.Push(2);
                  	s1.Push(3);
                  	s1.Push(4);
                  	Stack s2(s1);
                  	return 0;
                  }
                  
                  	// 深拷贝
                  	DataType* tmp = (DataType*)malloc(s._capacity * sizeof(DataType));
                  	if (nullptr == tmp)
                  	{
                  		perror("malloc fail\n");
                  		exit(-1);
                  	}
                  	memcpy(tmp, s._array, sizeof(DataType) * s._size);
                  	_array = tmp;
                  	// 浅拷贝
                  	_size = s._size;
                  	_capacity = s._capacity;
                  }
                  
                  public:
                  	Date(int year, int minute, int day)
                  	{
                  		cout 
                  		cout 
                  		cout 
                  	Date temp(d);
                  	return temp;
                  }
                  int main()
                  {
                  	Date d1(2022, 1, 13);
                  	Test(d1);
                  	return 0;
                  }
                  
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]