带指针类设
带指针类必须含有拷贝构造、拷贝赋值以及析构函数。
1.String类解析
在string类中有一个私有的指针指向内存中的字符串,当我们需要使用这个字符串时才通过指针去申请内存。
三大函数(BigThree)
拷贝构造:一个构造函数传入的第一个参数是自身类型的引用,而且外参数都有默认值。
例如(Rectangle(const Rectangle& other);)
拷贝赋值:它是对赋值运算符(=)的重载函数。
例如(Rectangle& operator=(const Rectangle& other);)
析构函数:析构函数与构造函数相反,释放对象使用的资源。
例如(~Rectangle();)
关于栈(stack),堆(heap)
1.栈(stack)
stack存在于某个scope的一块内存空间。 当调用某函数时,函数本身会形成一个stack来放置它所接收的参数、返回地址以及local objects。
在函数本体(function body)内声明的任何变量,其所用的内存块都取自上述stack。
2.堆(heap)
所谓system heap,是指由操作系统提供的一块global内存空间,程序可动态分配从其中获得若干区块。
举例:
classcomplex{... }; ......//对象C定义在任何作用域之外,因此是全局对象,作用域与static一样是整个程序。 complexC(1,2); {//c1所占空间来自栈,它在作用域结束后会被自动清理,因此称其为local object或auto object。 complexc1(1,2);//c2的生命在其scope结束之后依旧存在,直到整个程序结束。 staticcomplexc2(1,2);//使用new新建对象时,是先分配memory再调用ctor,在作用域结束后p依旧存在。 complex* p =newcomplex(1,2);//这里的单元由内存动态分配得来,因此用户有义务将其删除。 deletep;}
分析:
1.用new创建单个对象:
complex* pc =newcomplex(1,2);
上面一句代码在编译器中做了如下工作:
complex*pc;void* mem =operatornew(sizeof(complex) );//内部调用malloc分配内存。 pc =static_cast( mem );//转型pc->complex::complex(1,2);
2.使用delete释放内存:
String* pc =newString("Hello!"); ...deletepc;
这句代码在编译器中是先调用dtor,再释放内存。
complex::~complex( pc );//析构函数,将内存中的String释放。 operatordelete( pc );//释放指针的内存,内部调用free( pc )。
如果使用array new建立一个数组时,必须用delete[] 来进行内存释放。
命名空间:
namespace std
{
...
}
直接全部打开:
前置using namespace std;就可以使用命名空间所有名称
部分打开:
前置using std::cout;就可以在后面直接使用cout而不用提前申明了。
用时写全名:
例如:std::cin<<...;
std::cout<<...;