Class Constructor
今天翻阅了一下C++书,回忆起当初Class的四大组成部分,构造,析构,复制构造和赋值运算符函数。
并从一个string类的设计来用5个例子阐述,如何一步步完成带有heap空间的string类的设计,最初用字符数组有空间大小的局限,改为new之后
还会有共享资源错误,丢失资源指针等错误,大为所快!
记得剑指Offer看到复制构造函数必须参数为引用传递,否则会出现无穷递归调用复制构造函数情况,因为传入参数的过程也会调用复制构造函数,如果是值传递的话。
浅复制是直接修改指针为原资源,这样在析构的时候第二次会因为空间已释放二出错,但是这样还不够,当出现赋值的时候,默认的赋值运算符函数会直接申请新的空间,会丢失
原有的堆空间,所以需要做四件事情,也即释放原有空间,申请新的空间,拷贝内容,返回this, 因为这是一个operator函数,除了构造,复制构造,析构函数以外,似乎都需要
return this指针,因为需要返回一个对象类型的数据。
还记得之前写Leetcode由于不习惯写class,只写个面向过程,最后sort的comp()函数 始终编译出错,因为这种需要static, 因为non-static 都是每个对象一份,会用*this来调用
这个参数,隐藏在第一个参数里面。
还记得chenshuo大神,作为资深C++ developer,写了一个较简洁高端的string class的实现。
还有构造函数冒号语法会按照后面的顺序而不是定义的成员变量的顺序来初始化,二每个对象都是调用各自对象的构造函数的。
由于chenshuo大神说道,面试经常让你最快速度实现一个string类的设计,因此有了以下代码,尽管字符串常量传入会有问题,因为指向常量后,str3的字符串就不能修改内容了。
#include <iostream>
#include <cstdio>
using namespace std;
class String
{
public:
String(const char* pstr="")
{
str=new char[strlen(str)+1];
strcpy(str,pstr);//auto add \0
}
String(const String& str1)//must be ref, val will called non-limited recursive
{
str=new char[strlen(str1.str)+1];
strcpy(str,str1.str);
}
~String()
{
if(str!=NULL)
delete[] str;
}
String& operator=(const String& str1)
{
if(str != str1.str)
{
delete[] str;
str=new char[strlen(str1.str)+1];
strcpy(str,str1.str);
}
return *this;
}
void modify(char* ptr)
{
str=ptr;
}
void Show()
{
printf("%s\n",str);
}
private:
char* str;
};
int main()
{
String str1("zrc");
String str2(str1);
String str3=str1;
str3.modify("wch");
str1.Show();
str2.Show();
str3.Show();
return 0;
}
代收邮件,以为gmail代收了NTU邮箱,后来发现其实是NTU转发到gmail
后来发现puts 函数其实是自动append\n 的,以为只是输出一个字符串常量