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中没有这个规则
模板类就有点类似与函数的重载,它是对类型的重命名而不是去替换