前言
本章节主要介绍带指针的类的设计思路,并且总结与值传递的类的区别,注意凡是带指针的类的设计都要three big
一、string设计思路
1.基本类名string ,数据是一个字符指针char* c,放在private里面
2.构造函数string(const char* c1){},由于string是传一个指针进来的,构造函数需要初始化传进来的需要付初值=0,避免等会传进来时候会出现string();()里面什么都没有
3.传统意义上的three big,拷贝构造函数string(const string& s),拷贝赋值函数string& operator = (const strign& s1),析构函数~string();
4.成员函数 把私有数据指针拿出来。返回值类型为指针 char* get_ctr() {return c;}
class String
{
public:
String(const char* c = 0);
String(const String& s1);
String& operator =(const String& sp);
~String();
char* grt_ctr()const{ return ctr; }
private:
char* ctr;
};
二、string类的构造函数和析构函数
1.在堆区开辟一块内存,把传进来的指针先试用strlen()函数获取空间大小。然后使用strcpy(自己,别人)把内存空间里面的复制一份
2.突然还要考虑到如果传进来的是空的话,也要分配一个字节,里面装‘ /0’
String::String(const char* c = 0){
if (c){
ctr = new char[strlen(c) + 1];
strcpy(ctr, c);
}
else{
ctr = new char[1];
*ctr = '\0';
}
}
3.析构函数需要把指针的内存delete掉,注意上面用数组开辟内存空间,析构也要用数组形式
inline
String::~String(){
delete[]ctr;
}
三、string类的拷贝赋值函数
1.自我赋值会存在一个空指针,有内存泄漏的风险。所以首先判断是不是自我赋值,如果是自我赋值,就把this指针所指向的对象
2.否则先把本来指针指向的数组删除了,然后把要赋值的数组空间大小复制一份,然后最后strcpy一份。
3.最后返回赋是this指针所指向的对象,因为是返回对象本身,所以用引用的方式来接收
String& String::operator =(const String& sp){
if (this == &sp){
return *this;
}
else{
delete[] ctr;
ctr = new char[strlen(sp.ctr) + 1];
strcpy(ctr, sp.ctr);
return *this;
}
}
总结
主要总结了带指针的类,和值传递的类主要区别是三大件,同时数据一般都是通过一个指针来传递。复制通常步骤是先用strlen在堆区创建比数组本身大1的空间,多出来的‘\0’,然后用strcpy来复制。