C++你不知道的事
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++你不知道的事的更多相关文章
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- JavaScript 你不知道的事 -- 关于函数
接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...
- string.Format之你不知道的事
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- Gson 和 Fastjson 你不知道的事
背景 目前在公司负责的业务, 主要是跟JSON数据打交道, fastjson .gson都用, 他们适用于不同场景.fastjson号称是业界处理json效率最高的框架, 没有之一.但在某些场景下, ...
- javascript线程解释(setTimeout,setInterval你不知道的事)---转载
在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...
- LoadRunner 你不知道的事之——内存使用
LoadRunner的使用相信大家很熟悉,但是可能很少有人去关注一个Vuser 在以线程模式和进程模式下的内存开销情况,下面通过个人的试验得出一组数据供大家参考,只有你真正了解了,才能做的更深入. 测 ...
- 数据存储(一)--SharedPreferences之你不知道的事
一.SharedPreferences将数据文件保存在指定路径上 SharedPreferences原则上是仅仅能保存在当前应用程序私有的shared_prefs文件夹中,只是也不是绝对的,我们能够用 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)
john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...
- Android中那些有你不知道的事
在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activit ...
- 一、关于EF你不知道的事
一.EF 1. 只做查询 ,不用做修改时可以用,提高EF查询性能 var list = db.Users.AsNoTracking().First(x=>x.Name).ToList();
随机推荐
- 2021.8.24考试总结[NOIP47]
T1 prime 发现只需筛小于等于$mid(\sqrt r,k)$的质数,之后用这些质数筛掉区间内不合法的数即可. $code:$ 1 #include<bits/stdc++.h> 2 ...
- linux rtl8188eu ap模式 密码错误 disassoc reason code(8)
2018-05-30 14:12:46 于深圳南山科技园 最近有个项目,客户需要通过手机app通过机器wifi热点连接,从而实现对机器的设置及视频的实时预览等各种功能.这两天一直在搞rtl8188eu ...
- STL 去重 unique
一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ...
- etcd安装常用操作
etcd安装 etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现.共享配置以及并发控制(如 leader 选举.分布式锁等).kubernete ...
- mui轮播图为什么设置了自动播放参数也不能自动播放呢?
最近在做项目的时候,发现Mui的轮播图遇到个问题,设置了自动播放但是怎么也不能自动播放,这是为什么呢? 原来如果动态给mui的图片轮播添加图片,又使用的ajax获取的数据,但是你ajax 还没有执行完 ...
- 体验.NET Core使用IKVM对接Java
前言 与第三方对接最麻烦的是语言不同,因语言不同内置实现相关标准加密算法还是略微有所差异,对接单点登录场景再寻常不过,由于时间紧迫且对接方使用Java,所以留给我对接开发和联调的时间本就不多,于是乎, ...
- m3u8 ts 视频流爬取思路,合成
.... 先开调试,输入查找一下有没有 m3u8 文件 然后下下来用Notepad++ 打开一下 (以下的样子) 这里就是整个视频的视频流, .ts 的都是文件,都下下来, ------------ ...
- [loj3503]滚榜
一个小问题:题意中关于$b_{i}$的顺序只需要单调不降即可,相同时可任意选择 考虑$i$优于$j$的条件,即$val_{i}\ge val_{j}+[i>j]$,并记$del_{i,j}=\m ...
- [bzoj1135]Lyz
可以看成一张二分图,判断左半部分是否存在完美匹配根据hall定理,当且仅当左半部分每一个子集所连向的点数量超过了这个子集的大小都判定复杂度肯定爆炸,可以贪心,一定选择的是一个区间,即对于任意区间[l, ...
- 前端---梳理 http 知识体系 2
为什么要有HTTPS HTTP 天生具有明文的特点,整个传输过程完全透明,任何人都能够在链路中截获.修改或者伪造请求 / 响应报文,数据不具有安全性.仅凭HTTP 自身是无法解决的,需要引入新的HTT ...