用 new 建立动态对象:
A *p=new A(1,1)
用 new建立对象就象是用 new建立一个变量一样,分配一段相应大小的内存 (刚好能放下一个类的对象的空间 ),然后返回这段空间的首地址 (指针 ).但是为什么要和 构造函数 一同起作用呢?
因为光有 new分配内存的话,就好象是临时划给了一块地基,我们看不到建成的房子的结构是怎么样的,每个房间有多大,而构造函数就是在它得到这块地基后,马上就把这块地按图样 (构造函数 的实现 )建成了一套新房 (初始化 )。这时才能返回指针值 (门牌地址 )。
因为用 new建立的对象是动态对象,当不需要这个对象时,指针所指的空间将被浪费,所以要用 delete把指针删除,好比把这所房子的看门人全赶走了,那这块地又可以为大家所使用了。
缺省构造函数和对象数组,
不带参数 的 构造函数 就是 缺省构造函数 。如果没有定义任何 构造函数 时,系统会自动建立一个空的 缺省构造函数,它是空的,
徒有其表,所以建了也等于白建。
当定义一个对象数组 (成组的对象 )时,一定要建立一个 缺省构造函数 (系统建立的那个可没用 )为它们进行初始化。为什么呢,因为每个元素对象均需要调用一次 缺省构造函数 来为自己初始化。如同上面的比方,分地基是一个元素一个元素分的,前一块地没有确定下来,就不能返回相应指针,后面的分配就无法继续总之,定义对象 (局部对象 )或引用对象 (全局或静态对象 )时,
总要为对象初始化或者提供初始值才行。
析构函数析就是解除的意思,当对象消失时,它就跳出来执行 (实际上是被调用 )。这样就可以利用它来做一些清理工作。
析构函数 的定义和构造函数相同,与类同名只是名字前要加一个 "~"号,也是类中的成员函数。
局部对象 (在函数内建立的对象 )生存期结束 时被调用,也就是说函数中建立对象之后,它就开始生存,直到函数运行到遇见右括号 },它就结束生存,此时调用 析构函数 。
全局对象和静态对象的 析构函数 则是在 程序 (整个程序 )运行完毕
(或用 exit终止程序时 )被调用。
用 delete删除动态对象的方法,和前面的 new 建立动态对象过程相反,当 delete删除一个动态对象时,先调用它的 析构函数 (用前面的例子就是拆房子 ),然后释放这个动态所占的内存 (退地 )。
缺省析构函数 和前面的 缺省构造函数 一样,如果没有定义,
C++编译器自动产生一个,但是和没产生一样,因为它什么也不做。
对象初始化和对象赋值对象的初始化有几种方法:
一是 利用构造函数的参数,当建立对象时,在对象名之后的括号内给出对象的初值。如 Test Try(5);
二是 用等号在说明语句中进行初始化,如 Test Try1=5;这时,编译器仍把它们解释为对象名后带参数的语句;
三是 用 复制初始化构造函数 来初始化对象,如 Test Try2(Try1).也就是用一个已经初始化的对象来初始化现在的对象。但是当类中没有定义 复制初始化构造函数 时,C++就会自动生成一个 (这回不是空的 )缺省复制初始化构造函数 达到用 作为初始值 的对象的成员初始化 新对象的的相应成员的目的。但是这个缺省函数有时会产生问题。主要是当参数是指针的引用的情况。
对象成员在一个类中说明具有类的类型的数据成员,这些成员就称为 对象成员 。定义的方法是:
class 类名 {
类名 1 成员名 1 ;//事实上就是一个对象,这个对象的类型和名字类名 2 成员名 2 ;//别忘了分号
...
类名 n 成员名 n;
其他成员的类型 和 成员名 ;
}
对于有对象成员的类的初始化,也要有 构造函数 。定义的方法是:
X,,X(参数表 0):成员 1(参数表 1),成员 2(参数表 2),成员 n(参数表 n)
{
//...
}
初始化 有对象成员的类 的时候,先调用对象成员 的 构造函数,
对成员进行初始化,再执行 类 的 构造函数,对类中 其他成员 进行初始化。 析构函数 的调用顺序正好相反。