C++类的构造函数与析构函数


前言序锦:


很开深也很受教的一次C++学习,今天在图书馆自习,女票说要拿一道C++的题来考考我,说这道题颇有难度,当时的我是很激动的,毕竟作为程序猿来说,就相当于猎人嗅到了食物的味道一样O(∩_∩)O哈哈~,好了话不多说,直接来上题目吧……


正文:


题目:
calss A{
    A(){ p = this; }
    ~A(){ if( p != NULL ) { delete p; p = NULL; }}
    A* p; 
};
老铁们,请先不要继续往下看,先来自己品尝一下这道题吧,看你能不能很快OJ她!!!

分析:
看了这道题,我们可以朝着两个方向去寻找答案,“构造函数”和“析构函数”

 1,构造函数方面:
 由于A类中有一个指针A* p;
 而构造函数 A(){ p = this; }
 也就是说整个指针指向了对象本身,
修改为:`A(){ p = NULL; },`
在实际的程序中,可以将p指向别的对象,比如结构体中的next对象一样。

2,析构函数方面:
首先我们来看一下delete p,
这一句的操作就是让我们来手动释放掉p对象,
而我们又是将其定义在析构函数中,
则会出现,对象本来已经通过析构函数被析构掉了,
然后此处再次调用delete,
此时又会再次去进行析构,而析构的都是同一个对象,
这样就会形成无限递归调用析构函数,导致错误。

对就是这么“简单”的一道题,却隐含了这么多的知识,真的是让人感慨呀,当年学的C++感觉全都还给老师了呀,今天真的很感谢女票^-^给我这么个机会来好好脑补一下C++知识,下面我们还是来详细了解一下C++中的
this指针:


我首先看的是构造函数,A(){ p = this;}, 好奇特的构造函数,为什么什么都没有,第一句一开始就出现了一个变量p,还等于this,为了这一点,还专门去看一下this:
C++中的this:
1,对于上面的p = this,意思就是对于p的this就是p的this指针,如果有成员函数调用,比如说a.sum(),则sum函数可以通过隐形形参this来访问a,所以this是被调用对象访问调用他的对象的工具,可以理解为this指向调用他的对象;
2,默认情况下,this的类型是指向类类型非常量的常量指针,所以默认情况下,进行初始化时,我们不能把this绑定到一个常量对象上去。
3,this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显示传递;
4,只有在类的非静态成员函数中才可以使用this指针,其他任何函数中都不可以。
3,this指针时刻指向对象,在成员函数的开始执行前构造,在成员的执行结束后清除。


课后习题1:
课后小练习,等你来解决哟^-^,有答案的盆友们可以将你们的答案留言,我们一起学习!

写出类A的定义,通过类的静态成员来记录已经创建的A类的实例(对象)的个数,使得下面的程序
int main()
{
    A *pA = new A[10];
    cout<<"There are"<<pA->GetObjCount()<<"objects"<<endl;
    delete []pA;
    cout<<"There are"<<A::GetObjCount()<<"objects"<<endl;
    return 0;
}
得到的输出为:
There are 10 objects
There are 0 objects

比较简单但是很有代表性的一道题,欢迎各位伙伴们(^▽^)OJ,可以将你们的结果或者问题留下,我们一起学习……

小编也自己写了个比较简单的结果,大家感兴趣的也可以共同借鉴一下。

课后习题1答案:https://blog.csdn.net/HuaCode/article/details/80032628

猜你喜欢

转载自blog.csdn.net/huacode/article/details/80028074