C++你不知道的事
2016-04-25 22:55
344 查看
class A { public: A() { cout<<"A's constructor"<<endl; } virtual ~A() { cout<<"A's Destructor"<<endl; } }; class B : public A { public: B() { cout<<"B's constructor"<<endl; } virtual ~B() { cout<<"B's Destructor"<<endl; } }; int main() { B b; return 0; }
输出结果:
A’s constructor
B’s constructor
B’s Destructor
A’s Destructor
请按任意键继续…
构造顺序是先调用父类的构造函数,析构时先析构子类的,再析构父类的,理解成从外到内嵌套
#include <algorithm> #include <iostream> #include <map> #include <vector> #define IMIN numeric_limits<int>::min() #define IMAX numeric_limits<int>::max() #define FR(i,n) for(int i=0;i<n;i++) #define CLC(x) memset(x,0,sizeof(x)) #define FILL(x,c) memset(x,c,sizeof(x)) using namespace std; #include <iostream> class A { public: A() { foo(); } virtual ~A() { foo(); } virtual void foo() { std::cout << "1"; } void bar() { foo(); } }; class B : public A { public: virtual void foo() { std::cout << "2"; } }; int main() { B b; b.bar(); return 0; }
输出结果:121
定义B b,首先调用父类构造函数,父类构造函数调用自己所在的
foo(),输出1,然后bar(),调用B的foo(),B的是默认析构函数,最后调用B的A的析构函数
不能利用函数参数const与否来重载,只能是返回类型不同或参数个数或参数类型不同
带你理解C++对象初始化的不同方式
#include<iostream> using namespace std; class MyClass { public: int n; public: MyClass(int i = 0) : n(i) { cout <<"fir: "<< n<<endl; } MyClass( MyClass &x) { n = ++(x.n); cout <<"sec:"<< n<<endl; } MyClass &operator=( MyClass &x) { n = --x.n; cout <<"third:" <<n<<endl; return *this;} ~MyClass() { cout << n; } }; int main() { MyClass obj1(1), obj2(2);//直接初始化 MyClass obj3 = obj1;//复制初始化 MyClass obj4 ;//直接初始化 obj4 = obj2;//赋值运算符 return 0; }
输出:
fir: 1
fir: 2
sec:2
fir: 0
third:1
1212请按任意键继续…
来看看全局对象,静态对象,局部对象的析构顺序
#include <algorithm> #include <iostream> #include <map> #include <vector> #define IMIN numeric_limits<int>::min() #define IMAX numeric_limits<int>::max() #define FR(i,n) for(int i=0;i<n;i++) #define CLC(x) memset(x,0,sizeof(x)) #define FILL(x,c) memset(x,c,sizeof(x)) using namespace std; #include <iostream> class A { public: A() { cout<<"A's constructor"<<endl; } virtual ~A() { cout<<"A's Destructor"<<endl; } }; class B{ public: B() { cout<<"B's constructor"<<endl; } virtual ~B() { cout<<"B's Destructor"<<endl; } }; class C{ public: C() { cout<<"C's constructor"<<endl; } virtual ~C() { cout<<"C's Destructor"<<endl; } }; class D{ public: D() { cout<<"D's constructor"<<endl; } virtual ~D() { cout<<"D's Destructor"<<endl; } }; class E{ public: E() { cout<<"E's constructor"<<endl; } virtual ~E() { cout<<"E's Destructor"<<endl; } }; C c; E e; int main() { A *pa = new A(); B b; static D d; static E e; delete pa; return 0; }
C’s constructor
E’s constructor
A’s constructor
B’s constructor
D’s constructor
E’s constructor
A’s Destructor
B’s Destructor
E’s Destructor
D’s Destructor
E’s Destructor
C’s Destructor
请按任意键继续…
请按任意键继续…
构造函数的调用顺序是根据实际运行定义的先后
析构函数:
a.一旦delete就马上调用析构函数
b.局部对象的析构优先>static >global(同级之间按声明顺序逆序)
相关文章推荐
- C++面向对象实验(二)
- C语言规范:C89,C90,C95,C99
- c++创建对象的两种方式
- C++作业4
- c++第四次实验(穷举法解决组合问题,问题3)
- c++单例模式为什么不在析构函数中释放静态的单例对象
- c++作业4
- C++实验4-分数的累加
- Kinect2.0 挥手动作的识别(C++实现)
- c++作业4
- 我的第四次C++作业
- C语言里static的应用
- C语言之结构体内存对齐
- C++调用windows API
- OC语言,逻辑性的模拟通讯录,大家可以作参考
- C++ 类的保护继承与构造函数
- c++语言const关键字
- 实际问题与C语言会擦出什么的火花
- C++DLL导出类(快排,堆排,插入排序,选择排序,冒泡排序)
- c++作业4