C++面向对象高级编程(侯捷)—— 7.三大函数:拷贝构造函数,拷贝复制函数,析构函数

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;
}
发布了17 篇原创文章 · 获赞 2 · 访问量 7526

猜你喜欢

转载自blog.csdn.net/youshiwukong1524/article/details/105363721
今日推荐