C++中的“对象”之建立
在OOP编程中,对象是我们最感兴趣的东西。一直以来,在大脑中对象这个概念就是个模糊的东西,虽然看了不少有关C++语言设计方面的书籍,但都没有把对象这个概念的本质讲透,直到现在这个概念才清晰,对象的本质其实就是一段空的存储区域。
在C++语言中,对象又是如何来创建的?一个对象的创建,它总是要调用构造函数。
类的对象可以用多种方式来创建,下面是一些方式:
CIntStack mystack;//这个对mystack的声明试图调用默认构造函数
CIntStack s1(100); //这试图调用带有一个参数的构造函数来创建对象
CIntStack s2 = s1; //这种方式是通过一个现存的对象来建立,它必须调用类的复制构造函数
CIntStack *dsp = new CIntStack(200); //dsp所指向的对象必须通过在堆栈上动态分配内存而创建
CIntStack s3 = CIntStack(250); //这实际上是和CIntStack s2 = s1代码一样的,我们正在请求一个s3对象,并且用一个临时对象来初始化它,临时对象将在s3创建之后消失掉。
这五种方式用得最多的是第一种(静态创建)和第五种(动态创建)。
当创建对象的时候其实发生了3个步骤(无论它如何创建):
(1)编译器需要得到对象所要求的内存数量。
(2)这个要求的原始内存将转换为对象。这涉及到将数据成员放置在正确的位置,以及可能要建立成员函数指针表等等(当涉及到虚函数的时候)。这都在编译器内部进行,而程序员不用管它。
(3)最后,当(1)和(2)都完成的时候,编译器在这个新创建的对象上调用构造函数(类实现者提供或者编译器创建的默认构造函数)。
在静态创建对象的情况下,内存已经保留在进程数据区中或者在运行堆栈中,这样仅仅需要进行步骤(2)和(3)。在动态分配对象的情况下,编译器调用 new()运算符,以便为对象分配内存。然后,对新分配的内存进行步骤(2)和(3)。最后,返回指向这个对象的指针,它保存在上面的dsp中。