一,构造与析构
类C继承自A,C中包括一个成员B
以C类型实例化C
输出结果 A B C ~C ~B ~A
Dev-C++和VC 6.0结果相同;
若以A类型实例化C
A * c = new C();
delete c;
输出结果 A B C ~A
构造函数在调用前就对成员变量进行初始化,该成员变量为类类型时,调用其构造函数。
析构是相反。
二,delete this
delete语句可以看作如下两个过程,对于一个类类型的指针p来说
调用delete p的时候执行下面
p->~Object();
p->operate delete(p);
所以delete this应该是合法的
【转载】
你必须100%的确定,this对象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一个栈上的局部对象,也不是全局的,也不是另一个对象的成员,而是明白的普通的new)。
你必须100%的确定,该成员函数是this对象最后调用的的成员函数。
你必须100%的确定,剩下的成员函数(delete this之后的)不接触到this对象任何一块(包括调用任何其他成员函数或访问任何数据成员)。
你必须100%的确定,在delete this之后不再去访问this指针。
换句话说,你不能去检查它,将它和其他指针比较,和NULL比较,打印它,转换它,对它做任何事。自然,对于这种情况还要习惯性地告诫:当你的指针是一个指向基类类型的指针,而没有虚析构函数时(也不可以delete this)。
【/转载】
三,指针和数组
下面代码中试图返回p作为指针并输出
结果不可以预料。
p在printf前被释放
应将p[]改为* p
四,malloc
(p=(char *)malloc(0)) == NULL?
(p=(char *)malloc(0)) != NULL
C99标准(ISO/IEC 9899:1999 (E)):
If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申请某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
五,类型转换
int main(void)
{
unsigned int a = 10;
int b = -20;
printf("%d ",a+b);
}
我记得unsigned的级别应该高于int……
但是结果居然是-10
=。=!谭浩强C上也写的是double>long>unsigned>int
悲剧了。
测试如下:
结果
uint -10 int -20 uchar 246 char -10
uint+int -30 uchar+char 236
看来是printf的关系了。
再测
结果
uint -20 int -10 uchar 236 char -10 char246 -10
uint+int -30 uchar+char 226
int -10 > uint -20
uchar -20 > char -10
uchar -20 > char 246=-10
最后就是用cout测试
识别uint……