cpp_go_hdc3

Big Three ,三个特殊函数

class String
{
     
public:
	String(const char* cstr = 0); //构造函数
	String(const String& str);	// 拷贝构造函数
	String& operator=(const String& str)	//拷贝赋值
	~String();		//析构函数
	char* get_c_str() const {
      return m_data};	//内联成员函数
private:
	char* m_data;
}

ctor和dtor(构造函数和析构函数)

inline 
String::String(const char* cstr = 0)	//传入空字符串
{
     
	if(cstr) {
     
	m_data = new char[strlen(cstr)+1];	//new分配一个足够空间
	strcpy(m_data,cstr);
	}
	else {
     //未指定初值
		m_data = new char[1];	//为了存放\0 new分配一个数组空间
		*m_data = '\0';
	}
}
inline
String::~String()	// 析构函数
{
     
	delete[] m_data;	//释放动态分配的内存
}
{
     
	String s1(),
	String s2("hello");

	String* p = new String("hello");	//动态创建一个字符串
	delete p;
}



class with pointer members 必须有copy ctor 和 copy op

浅拷贝:
cpp_go_hdc3_第1张图片
深拷贝:
copy ctor(拷贝构造函数)

inline 
String::Stirng(const String& str)
{
     
	m_data = new char[ strlen(str.m_data) + 1]	// 创建空间 
	strcpy(m_data, str.m_data);		//内容传递
}
{
     
	String s1("hello");	//直接取另一个object的private(兄弟之间互为friend)
	String s2(s1);
//  String s2 = s1;
}

copy assignment operator(拷贝赋值函数)

  1. 清空
  2. 创建
  3. 复制
inline 
String& String::operator=(const operator& str)
{
     
	if (this == &str)
		return *this;
	delete[] m_data;		//1
	m_data = new char[ strlen(str.m_data) + 1];	//2
	strcpy(m_data, str.m_data);		//3
	return *this;
}
//赋值操作
{
     
	String s1("hello")
	String s2(s1);
	s2 = s1;	//1赋值到2上
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一定要在operator=中检查是否self assignment

cpp_go_hdc3_第2张图片

你可能感兴趣的:(cpp_go_hdc3)