C++中类的6个默认成员函数 【拷贝构造函数】
温馨提示:这篇文章已超过462天没有更新,请注意相关的内容是否还可用!
文章目录
- 拷贝构造函数的使用
- 拷贝构造对于自定义类型【浅拷贝】
- 深拷贝
- 拷贝构造函数典型调用场景
拷贝构造函数的使用
-
在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象
-
那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?
-
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
拷贝构造函数也是特殊的成员函数,其特征如下:
- 拷贝构造函数是构造函数的一个重载形式。
- 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
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; }- 下面我们解释一下:
- 这里的const可加可不加,但是建议加上
- 有些人就写这个写昏头了,写反了,不加const的话不会提示
- 加上了就知道哪里错了,所以还是加上较好
- 这里的拷贝构造必须传引用,要不然会引发无穷递归【反正编译会报错~】
- 再看下面代码,我是没有写拷贝构造的,但是这里自动拷贝了,毕竟这个是默认成员函数,这里生成的还和之前几个的默认成员函数还不一样,之前的对默认成员函数对内置类型不处理,而这个拷贝构造对内置类型处理了,如果没有处理,这里就拷贝不出来
- 说明这里会自动生成一个拷贝构造函数,将值拷贝回去
- 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
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; }
- 这里的拷贝构造必须传引用,要不然会引发无穷递归【反正编译会报错~】
- 加上了就知道哪里错了,所以还是加上较好
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!




