学习记录20201030

c++学习记录20201030
柔性数组

class String
{
	struct StrNode
	{
		int ref;//标记对象的个数
		int size;//空间的大小
		int len;//字符串的长度
		char data[];
	};
private:
	StrNode * pstr;
public:
	String (const char *str = NULL)
	{
		if(str != NULL)
		{
			int n = strlen(str) + 1;
			pstr = (StrNode*)malloc(size(StrNode) * 2*n);
			pstr->ref = 1;
			pstr->size = n;
			pstr->len = 2*n;
			strcpy(pstr->data,str);
		}
		else
		{
			pstr = NULL;
		}
	}
	String(const String &st):pstr(st.pstr)
	{
		if(st.pstr != NULL)
		{
			st.pstr->ref += 1;
		}
	}
	~String()
	{
		if(pstr != NULL && --pstr->ref == 0)
		{
			free(pstr);
			pstr = NULL;
		}
	}
};
int main()
{
	String s1("Hello");
	String s2(s1);
	String s3(s1);
	String s4(s1);
}

当需要多次拷贝一个对象时,如果使用之前的那种再开辟空间的拷贝构造函数,将会造成内存空间的浪费,因此我们可以使用柔性数组来节约内存。

上面的那个构造体的大小为12个字节,当拷贝相同的对象时,调用新的拷贝构造函数,会将ref这个标记+1,而不会开辟新的内存空间,但要释放时,ref这个标记-1,当标记为0时,才真正将这个空间释放掉

模板类
当我们遇到函数功能相同,但是参数类型不同的重载时
如:

int fun(){};
double fun(){};
char fun(){};

我们可以使用模板类来解决这个问题

template <class Type>
Type fun(){};

当我们在主函数去使用时,只需要告诉编译器,是什么类型的就可以了

fun<int>();
fun<double>();
fun<char>();.

知识小点:
static 静态关键字存放在数据区(.data),只能初始化一次且要在类外初始化
静态成员为所有对象共享

c++中的函数重载使用了名称粉碎规则,所以才可以实现函数的重载,而在c中没有这个规则

模板类就有点类似与函数的重载,它是对类型的重命名而不是去替换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值