
C++ 之构造函数(拷贝/复制构造函数)
使用另一个同类型的对象来初始化新对象 将对象作为参数传递给函数 函数返回对象 类包含动态分配的内存 类包含不可共享的资源 类包含虚基类或其他需要深拷贝的成员
发布日期:2021-05-14 16:35:32
浏览次数:38
分类:精选文章
本文共 1978 字,大约阅读时间需要 6 分钟。
构造函数
拷贝构造函数概念
拷贝构造函数是一种特殊的构造函数,它在创建对象时,通过使用同一类中之前创建的对象来初始化新创建的对象。这种方式在处理动态内存分配的情况下特别重要。通常有以下几个使用场景:
这种方式确保新对象的所有数据成员都被正确复制,避免了直接使用指针或其他共享资源带来的问题。
引例分析
第一问:自定义String类
要求说明
需要自定义一个简单的String
类,以简化字符串操作。类的成员包括一个字符指针和一个长度属性。默认构造函数初始化为空字符串。
解决方案
如果不重载赋值运算符,对象会直接拷贝旧的指针值,这样两个对象会共享同一个内存块。这对包含动态内存分配的类来说是错误的。因此,我们需要重载赋值运算符,确保每次赋值都完成完整的深拷贝。
String & String::operator=(String & str) { delete[] value; length = strlen(str.value); value = new char[length + 1]; strcpy(value, str.value); return *this;}
第二问:另一种场景
当同一个类的对象初始化另一个对象时,必须定义拷贝构造函数。
String str1("abc");String str2(str1);
正确的拷贝构造函数定义如下:
String::String(const String & str) { length = strlen(str.value); value = new char[length + 1]; strcpy(value, str.value);}
具体实例
MyString类实现
MyString.h
#ifndef MYSTRING_H#define MYSTRING_H#include#include using namespace std;class MYString {public: MYString(); MYString(char * str); MYString(const MYString & str); virtual ~MYString(); const MYString & operator=(const MYString & str); friend ostream & operator<<(ostream & out, const MYString & str);protected:private: int m_length; char * m_value;};
MyString.cpp
#include "MYString.h"#includeMYString::MYString() { m_length = 0; m_value = new char[1]; m_value[0] = '\0';}MYString::MYString(char * str) { if (str == NULL) { m_value = new char[1]; m_value[0] = '\0'; return; } m_length = strlen(str); m_value = new char[m_length + 1]; strcpy(m_value, str);}MYString::MYString(const MYString & str) { m_length = strlen(str.m_value); m_value = new char[m_length + 1]; strcpy(m_value, str.m_value);}ostream & operator<<(ostream & out, const MYString & str) { out << str.m_value; return out;}
小结
对于简单的类,默认拷贝构造函数通常足够。但在以下情况下,必须显式定义拷贝构造函数:
拷贝构造函数是确保对象完整拷贝所有数据成员的关键工具,其正确使用是程序开发的重要基础。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月07日 04时57分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Scala中的包
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
获取linux 主机cpu类型
2019-03-11
Android Studio updating indices 一直刷新和闪烁
2019-03-11
pwntools编写技巧
2019-03-11
How2Heap笔记(三)
2019-03-11
layer.confirm 无效
2019-03-11
pycharm使用(新建工程、字体修改、调试)
2019-03-11
Python学习笔记——元组
2019-03-11
异常声音检测
2019-03-11
无法打开文件“opencv_world330d.lib”的解决办法
2019-03-11
算法训练 未名湖边的烦恼(递归,递推)
2019-03-11
什么是接口
2019-03-11
记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
2019-03-11
JavaScript高级程序设计第四版学习记录-第九章代理与反射
2019-03-11
怎么解决Windows 10文件/文件夹正在使用无法删除
2019-03-11
matlab函数:fix 向0取整
2019-03-11
Allegro中如何消除器件本身Pin间距报错
2019-03-11