诗二首

《孩子》

妈妈在远方,轻声呼唤
我能感应,声波穿透了跳动的心
震颤爬满疲惫的身躯
是的,一个孩子
想留驻在青涩的记忆里

把思绪尘封
蜷曲成懵懂的胚胎
我愿意这就是永远
一个没有成熟的果实

可是谁都不能阻止
年华腐烂、忧伤弥漫
声音嘶哑到无法呐喊
只有孩子才会
在阳光明媚里轮回

《渐渐》

轻轻的回眸
把北京的黄昏
存成一片朦胧的影像
作为告别的句点
远去的铁道灯
模糊的地平线
自己为自己送别
疲惫的身躯
陌生的脸庞
是否离家又近了一点

589 次阅读

好久没碰C++了,复习下:C++类的初始化

1. 构造函数的执行顺序
———————-

假设有如下两个类:

class Shape
{
public:
Shape()
{
printf(“Shape’s default constructor!\n”);
}

// 注意char *s中的*号和s放在一起,表示定义了一个char的指针
// 因此可以同时定义成如下样子:
// char ch, *s, *msg
// 表示定义了一个ch字符和两个指针
Shape(char *s)
{
printf(“Shape’s constructor with msg: %s\n”, s);
}

Shape(int a)
{
printf(“Shape’s constructor with parameter(int a).\n”);
}
};

class Circle: public Shape
{
public:
Circle()
{
printf(“Circle’s default constructor!\n”);
}

Circle(int a) : Shape(“Init Shape Directly”)
{
printf(“Circle’s constrctor with parameter(int a).\n”);
}
};

所有子类(Circle)构造函数如果没有显式调用父类(Shape)构造函数时均会调用父类的默认构造函数。

例如:new Circle() 产生的结果是:

Shape’s default constructor!
Circle’s default constructor!

而 new Circle(1) 产生的结果是:

Shape’s constructor with msg:Init Shape Directly
Circle’s constrctor with parameter(int a).

第二种情况已经使用了某一个构造函数初始化父类,此时不再调用默认构造函数。

2. 对数据成员的构造
——————–

如果上例中的Circle类写成下面这样:

class Circle: public Shape
{
private:
Shape s;

public:
Circle()
{
printf(“Circle’s default constructor!\n”);
}

Circle(char *msg) : Shape(msg)
{
printf(“Circle’s default constructor!\n”);
}

Circle(int a) : Shape(“Init Shape Directly”), s(“Init a member object of Circle.”)
{
printf(“Circle’s constrctor with parameter(int a).\n”);
}

};

此时涉及到成员对象初始化的情况,如果使用new Circle()来构造,产生的结果是:

Shape’s default constructor!
Shape’s default constructor!
Circle’s default constructor!

第一行是Circle初始化的时候调用Shape的默认构造函数产生的,之后就是Circle自己的初始化,初始化s成员对象,所以又调用了一

次Shape的默认构造函数,最后才调用Circle的初始化函数。

使用Circle的第二个构造函数能够看的更清楚一些:new Circle(“Init parent class directly!”),产生的结果是:

Shape’s constructor with msg: Init parent class directly!
Shape’s default constructor!
Circle’s default constructor!

使用Circle的第三个构造函数,就是显式的初始化成员变量s,例如:new Circle(1) 显示的结果是:

Shape’s constructor with msg:Init Shape Directly
Shape’s constructor with msg:Init a member object of Circle.
Circle’s constrctor with parameter(int a).

因此,可以看到成员对象的初始化顺序是:

初始化父类 -> 初始化子类成员 -> 调用子类构造函数体
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

其中,初始化父类的构造函数选择顺序是:

调用显式构造函数 > 调用默认构造函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3. 简单类型的数据成员的初始化
——————————

这个问题要简单得多:

class Circle
{
private:
int r;
Shape *parent;
public:
Circle() : r(10), parent(NULL)
{
}
};

可见,只需要直接将需要初始化的值,放在构造函数的初始化列表当中即可。

(以上程序用GCC编译通过)

617 次阅读