GeekBand 随笔分享(二)
一、主题一:(三大函数)
//-------------------------------------------解析------------------------------------------------------------------------
1》默认构造:
如果没有为一个类显式地定义任何构造函数,编译器将自动为这个类生成默认构造函数。
由编译器创建的默认构造函数称为合成的默认构造函数,它将依据如下规则初始化类中的成员变量:
1.内置数据类型的初始化:
内置数据类型是否自动初始化取决于变量定义的位置。如果变量在全局作用域内定义(即不在任何函数中)或定义为静态局部变量,则这些成员将被初始化为0。如果变量在局部 作用域内定义,则这些成员没有初始化。
2.类类型变量的初始化:
调用类的默认构造函数来初始化类类型变量。
2》拷贝构造:
一般分为浅拷贝与深拷贝两种。深拷贝在实际编程中得到可靠的应用。最主要就是避免了在拷贝的过程中,一些内存泄露。
深拷贝一般采用先申请内存空间,再进行拷贝工作。
3》拷贝赋值:
拷贝赋值一般采用方法为:例如A ->B
1. 把B的内容清理掉;
2. 把A复制给B;
当然赋值构造函数必须能够处理自我赋值的问题,因为自我赋值会出现指针指向一个已经释放的内存。
二、主题二:(堆、栈、内存管理)
1》new:
new”是C++的一个关键字,同时也是操作符。
我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。如果我们创建的是简单类型的变量,那么第二步会被省略。example:
class A { int i; public: A(int _i) :i(_i*_i) {} void Say() { printf("i=%d/n", i); } }; A* pa = new A(3); 那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上): A* pa = (A*)malloc(sizeof(A)); pa->A::A(3); return pa;
2》delete:
它与new相类似 ,调用过程相反。
三、主题三:( 类模版、函数模版)
1》class template:
如同函数模板一样,使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型。类模板是对一批仅仅成员 数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从 而大大提高编程的效率
定义类模板的一般形式是:
template <类型名 参数名1,类型名参数名2,…>
class 类名
{
类声明体
};
例如:
template <class T> class Smemory {… public: void mput(T x); … }
2》this 指针:
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。例如,
调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
静态成员函数没有this 指针,所以它不能处理成员对象,它只能处理static数据.