c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
2014-05-18 21:40
555 查看
测试源码:
测试代码:
![](https://img-blog.csdn.net/20140518211530171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。
而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数,这是因为对象创建时候对象存放在堆栈中的原因。(new 的对象虽然是存在堆中,但是在堆栈中依然存放其堆中的地址,因此,析构的时候也是一样)
那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢,这是肯定的,如下
测试代码:(仅修改main里面的内容)
![](https://img-blog.csdn.net/20140518212405171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那如果是创建指向其对象的数组呢? A *a[2];
那么这个时候,如果A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?
![](https://img-blog.csdn.net/20140518213035218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到,虽然没有调用构造函数,但是依然可以使其执行其成员函数呢!
那么,如果A有一个public int i;的变量,a[0]->i,会是什么?
测试代码:
结果:
![](https://img-blog.csdn.net/20140518213450812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到,a[0]->i指向一个不确定的值!如果指定static const int i=1;那么,指向的必然就是1了。
今天就先测试这些最简单的吧,有点累了,多继承,虚基层明天再测试。
突然发现好像上次UC笔试做这道题的时候,析构的顺序似乎弄错了,郁闷。
还没收到面试信息,也还没有受到笔试挂了的通知,也不知道是个什么情况啊。
继续努力吧。
有时候,细节真的很重要!
//测试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } }; //公有继承 class A:public base { public: A() { cout<<"A created!"<<endl; } ~A() { cout<<"A destroyed!"<<endl; } }; class B:public A { public: B() { cout<<"B created!"<<endl; } ~B() { cout<<"B destroyed!"<<endl; } };
测试代码:
int main() { A a; <span style="color:#ff0000;">A *a1;</span> cout<<"可以看到a1并没有调用基类的构造函数"<<endl; <span style="color:#ff0000;">A *a2=new A;</span> //只有在new 一个对象的时候才会调用基类的构造函数 cout<<"可以看到a3也并没有调用基类的构造函数"<<endl; A *a3=&a;
B b; }输出为:
可以看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。
而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数,这是因为对象创建时候对象存放在堆栈中的原因。(new 的对象虽然是存在堆中,但是在堆栈中依然存放其堆中的地址,因此,析构的时候也是一样)
那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢,这是肯定的,如下
测试代码:(仅修改main里面的内容)
int main() { A a[2]; }结果为:
那如果是创建指向其对象的数组呢? A *a[2];
int main() { A *a[2]; }答案显然是不会。
那么这个时候,如果A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?
void fun() { cout<<"A fun run"<<endl; }测试代码:
int main() { A *a[2]; a[0]->fun(); }结果为:
可以看到,虽然没有调用构造函数,但是依然可以使其执行其成员函数呢!
那么,如果A有一个public int i;的变量,a[0]->i,会是什么?
class A:public base
{
public:
int i;
A()
{
cout<<"A created!"<<endl;
}
~A()
{
cout<<"A destroyed!"<<endl;
}
void fun() { cout<<"A fun run"<<endl; }
};
测试代码:
int main() { A *a[2]; a[0]->fun(); cout<<endl<<a[0]->i<<endl; }
结果:
可以看到,a[0]->i指向一个不确定的值!如果指定static const int i=1;那么,指向的必然就是1了。
今天就先测试这些最简单的吧,有点累了,多继承,虚基层明天再测试。
突然发现好像上次UC笔试做这道题的时候,析构的顺序似乎弄错了,郁闷。
还没收到面试信息,也还没有受到笔试挂了的通知,也不知道是个什么情况啊。
继续努力吧。
有时候,细节真的很重要!
相关文章推荐
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)
- c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
- C++学习笔记(调用构造函数和析构函数的顺序)
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
- C++学习笔记(4)——派生类的构造函数和析构函数
- 【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
- C++基础:派生类的构造函数与析构函数调用顺序
- C++之派生类的构造函数和析构函数调用顺序
- C++ Primer 学习笔记(8): 构造函数、析构函数调用顺序
- C++派生类构造函数和析构函数调用顺序
- C++学习笔记-----不要在构造函数和析构函数中调用虚函数
- C++:派生类的构造函数和析构函数的调用顺序
- C++学习笔记51——在构造函数和析构函数中调用虚函数
- C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
- C++中构造函数与析构函数的调用顺序
- C++继承中构造函数、析构函数调用顺序及虚析构函数
- C++ 派生类构造函数、析构函数调用 [大三TJB_708]
- C++基类、派生类构造函数调用顺序