c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
2015-06-29 12:35
639 查看
测试源代码:
測试代码:
能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。
而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此。析构的时候也是一样)
那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢。这是肯定的。例如以下
測试代码:(仅改动main里面的内容)
那假设是创建指向其对象的数组呢? A *a[2];
那么这个时候,假设A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?
能够看到,尽管没有调用构造函数,可是依旧能够使其运行其成员函数呢!
那么,假设A有一个public int i;的变量,a[0]->i,会是什么?
測试代码:
结果:
能够看到,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笔试做这道题的时候。析构的顺序似乎弄错了,郁闷。
还没收到面试信息。也还没有受到笔试挂了的通知,也不知道是个什么情况啊。
保持。
有时,细节很重要!
相关文章推荐
- VC++多线程编程
- 斐波那契数列-数组和递归-C语言
- (6)风色从零单排《C++ Primer》 结构体,头文件
- leetcode 日经贴,Cpp code -Majority Element II
- C++编译与链接-浅谈内部链接与外部链接
- 终端下编译运行一个简单C++程序流程
- C++ STL map使用
- system ():
- C/C++中extern关键字详解
- C++ Primer 学习笔记_31_STL实践与分析(5) --再谈string类型(上)
- C++ Primer 学习笔记_30_STL实践与分析(4)
- C++ Primer 学习笔记_29_STL实践与分析(3) --顺序容器的操作(下)
- C++ Primer 学习笔记_28_STL实践与分析(2) --顺序容器的操作(上)
- C++ Primer 学习笔记_27_STL实践与分析(1) --顺序容器的定义、迭代器
- Windows客户端C/C++编程规范“建议”——风格
- C++拷贝构造函数
- C++虚继承
- C++多重继承
- C++虚函数与纯虚函数用法与区别
- C++ 关于MFC List Control 控件的总结