泛型编程三:带指针的类(string)


前言

本章节主要介绍带指针的类的设计思路,并且总结与值传递的类的区别,注意凡是带指针的类的设计都要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来复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值