(Boolan)面向对象高级编程(上)第二周笔记

带指针类设

带指针类必须含有拷贝构造、拷贝赋值以及析构函数。

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<<...;

推荐阅读更多精彩内容