IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 侯捷C++面向对象高级编程之---(7)三大函数:拷贝构造函数,拷贝复制函数,析构函数 -> 正文阅读

[C++知识库]侯捷C++面向对象高级编程之---(7)三大函数:拷贝构造函数,拷贝复制函数,析构函数

参考文章,更为详细https://www.cnblogs.com/yibeimingyue/p/12301430.html
字符串类的例子,是侯老师自己写的,因为标准库的例子功能太复杂了。

编译器提供的拷贝赋值只是拷贝了对象的指针,没有真正拷贝对象。

Class with pointer member(s) —— string 目标:

int main() {
	String s1();
	String s2("hello");
 
	String s3(s1); // 拷贝构造函数
	cout << s3 << endl;
 
	s3 = s2; // 赋值运算符重载
	cout << s3 << endl;
 
	return 0}

注意

  • 如果没有写拷贝构造函数和重载=(拷贝赋值),编译器默认有,忠实的一个bit一个bit的拷贝。
  • 复数可以用默认,直接拷贝实部和虚部
  • 但是如果有指针,不可以用默认的
  • class with pointer member 必须有 copy ctor 和 copy op=
    在这里插入图片描述
    默认的是浅拷贝,我们要写深拷贝

三大函数

类定义:
class String
{
public:
String(const char* cstr = 0); // 基础函数
String(const String& str); // 1.拷贝构造函数
String& operator=(const String& str); // 2.拷贝赋值 重载=
~String(); // 3.析构函数
char* get_c_str() const { return m_data; } // 不改data,const
private:
char* m_data;
};

构造函数 ctor 和 析构函数 dtor

inline
String::String(const char* cstr = 0) {
	if (cstr) {
		auto len = strlen(cstr);
		m_data = new char[len + 1];
		memset(m_data, 0, len+1);
		strcpy(m_data, cstr);
	}
	else { // 未指定初值
		m_data = new char[1];
		*m_data = '\0';
	}
}
 
inline
String::~String() // 防止内存泄漏
{
	delete[] m_data;
}

拷贝构造函数 copy ctor

inline
String::String(const String& str) {
	auto len = strlen(str.m_data); // 直接取另一个的data,因为兄弟之间互为friend
	m_data = new char[len + 1];
	memset(m_data, 0, len + 1);
	strcpy(m_data, str.m_data);
}

拷贝赋值函数 copy assignment operator
注意!要检测自我赋值的情况
在这里插入图片描述

inline String&
String::operator=(const String& str) {
	if (this == &str) { // 0.自我赋值检测,否则直接delete,没有数据了
		return *this;
	}
	delete[] m_data; // 1.清空被赋值的内容
	auto len = strlen(str.m_data);
	m_data = new char[len + 1]; // 2.申请新的内存
	memset(m_data, 0, len + 1);
	strcpy(m_data, str.m_data); // 3.拷贝
	return *this;
}

重载<<

inline ostream&
operator<<(ostream& os, const String& str) {
	os << str.get_c_str();
	return os;
}

补充内容:在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:40:26  更:2021-10-07 13:40:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:00:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码