一个类的对象的生命历程如下:
申请内存——>初始化列表——>构造函数——>参与运算——>析构函数——>释放内存。
在上述过程中存在三个特殊函数(Big Three):拷贝构造函数、拷贝复制函数、析构函数。
拷贝构造函数(copy constructor function)在以下三种情况下将被调用:
1. 定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
2. 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
3. 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。
对象间的拷贝分为两种情况,一种叫作浅拷贝,另一种叫作深拷贝。浅拷贝将一个对象相应的成员数据赋给另一个对象,但是他们所指向的是同一块内存中的数据。深拷贝将一个对象相应的成员数据赋给另一个对象,但是他们占用不同的内存存储相同的成员数据。
如果数据成员中不包含指针的话就用浅拷贝构造函数就行,如果包含了指针就需要用到深拷贝构造函数,即为该指针在堆上开辟一块内存空间。若使用浅拷贝,两个指针将指向同一个内存空间,当析构时,该内存空间将被释放两次。
关于堆(Heap)、栈(Stack):
一般说的堆栈指的是就是栈。
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收),所以调用这些对象的速度要相对来得低一些。
堆(数据结构):堆可以被看成是一棵树,如:堆排序。
栈(数据结构):一种后进先出的数据结构。
详解参考:http://www.cnblogs.com/kira2will/p/3957545.html
如果没有自定义的析构函数则系统自动生成,析构函数在对象销毁时自动调用,析构函数没有返回值、没有参数也不能重载。
使用运算符 new 可以申请单个内存时可直接初始化,如 int *p=new int(20)。new 内部调用 malloc 函数,先分配内存,再调用构造函数。申请内存时存在风险,要处理p==NULL的状况。申请内存之后必须用运算符 delete 释放,delete 内部先调用析构函数,再释放内存。new 需要与 delete 搭配使用,array new 则必须与 array delete 搭配使用。
String* p = new String[3];
...
delete[] p;
类之间的三大关系分别为复合、委托与继承。复合表示 has-a,构造时由内而外,析构时有外而内。委托同样表示 has-a,可以看作一种引用形式的复合。继承表示 is-a,其构造由内而外,即先调用基类的构造函数,再调用派生类的构造函数;析构由外而内,即先调用派生类的析构函数,再调用基类的析构函数。
Container::Container(...): Component() { ... };
Container::~Container(...) { ... ~Component() };
Derived::Derived(...): Base() { ... };
Derived::~Derived(...) { ... ~Base() };
几种设计模式概述
Singleton 模式:Singleton 是对全局变量的取代策略,保证一个类只能有一个实例,并提供一个全局唯一的访问点。
Strategy 模式:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
Adapter 模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
pImpl 模式:将客户与所有关于类的私有部分的知识隔离开,其主要作用是解开类的使用接口和实现的耦合,可以作为编译防火墙。
Template Method 模式:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Observer 模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
Composite 模式:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
Prototype 模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。