送你一个小红人

认识老李,还是龙湖CEO邵明晓三年前组的一个局。

老邵是中国地产界唱歌最好的CEO,这是惠新钱柜KTV的保安都知道的。从龙湖公司下来,拐个弯,就能到钱柜。老邵一出现在大厅,保安会迅速刷开3楼的电梯。龙湖曲折的发展过程中,很多决定都是在三楼VIP包厢里诞生的。龙湖能把自己熬成市值最高的地产公司,这个包厢功不可没。

这些年,北京的钱柜陆续关了,只剩惠新那家。我们常说,要不是老邵支持,这硕果仅存的钱柜早关门了。

老李和老魏朋友。空降到饭局那天,老邵和老魏都介绍说,送你一个小红人,老李有很多网红和美女资源。

我不禁对老邵肃然起敬。这些年每次跟他唱歌,都是和一帮油腻的中老年男孩。这次好像待遇不一样了。

我加了老李的微信。他的电子名片是:天下秀董事长李檬。这种姓“天”的公司名字一听,就十分敞亮。我很感动,不断敬老邵酒。

可是当晚老邵连钱柜都没有去。后来,我看到老李在朋友圈分享最多的,不是会所,而是他自己写的公众号,关于创业、新消费乃至广告的思考。

再后来,看到了老李公司上市的消息。我当时仔细研究了下,非常失望:

原来天下秀不是一家演艺公司。

1

1999年有点意思。

20岁的龙岩人王兴在清华读大三,刚建了人生中第一个网站。他喜欢跳一种叫“黄土黄”的传统舞蹈,跳时赤裸上身,胸前绑鼓。

精通计算机和BBS的李想,出于对互联网和IT的热爱,决定放弃参加高考,选择创业,成立泡泡网。25岁的刘强东在中关村卖刻录机,面对电视台的镜头,他一脸羞涩地说:

一个月能赚个几万块。

那一年,即将大学毕业的李檬,是这些人里起点最高的,他在北京郊区昌平县有个美食城。

大学时,他给父亲写了一封很长的信,要了3万块钱。父亲跟他说3万块钱可以买一辆自己喜欢的车。但李檬拿着那3万块钱去创业了。

他在学校周边找到一个刚建成的大楼,用那3万块钱给大厦老板交了定金,承包了2层小吃城。他又去学校周围找推着小推车的商贩们,预收了十几万定金。

他用这些定金把小吃城装修好,租给了这群小商贩。开业后他雇了很多人发传单,小吃城很快就火了。他一年把定金和成本挣了回来。

兽爷摊煎饼最享受的,是每次微信到账的声响,叮铃一声,您有五块钱到账了。但李檬非常凡尔赛,他说第一次创业过程最享受的,不是挣了钱,而是自己的逻辑判断得到了验证。

第一次创业成功的李檬,很快进入贤者时刻。

还好,他读到了一本名字叫《未来时速—数字神经系统与商务新思维》的书。书的作者,是当时的世界首富比尔盖茨。这本书很朴实,作为过去30年占据世界首富宝座最久的富豪,盖茨在书里历数了微软犯下的错误。

不过书里最吸引李檬的,是盖茨的15个预言。43岁的盖茨,在1999年就描述了十年后世界会变成什么样子。

他预言,由于数字信息速度的增加,智能手机、即时支付、社交媒体、在线招聘、在线课程、基于用户兴趣的网站等,将彻底重塑未来的商业和生活。盖茨说:

你越年轻,计算机对你而言就越重要。

作家柳青说过,人生道路虽然漫长,但紧要处常常只有几步。

为了跟盖茨一样酷,不差钱的李檬毕业前去微软ATC教育部门实习了几个月,在高校发展和推广微软的软件。

之后,这个山东祖籍内蒙出生河北长大北京上学的小伙子决定卖掉美食城,投身互联网。

煎饼生意从此少了一个竞对,互联网生意又多了个抓手。

2

现在年轻网民们最熟悉的数字,不是“91”,可能就是“1024”。但时间倒流20多年,老一代的中国网虫最熟悉的数字,是“163”和“263”。

163是丁磊的,263是首都在线的。那会儿两家打得很凶,都有游戏,也都有热门产品——邮箱。

首都在线(263.net)是当时最骚的网站之一,除了邮箱业务之外,全国网民都用电话拨号上网的方式,用极慢的网速在263上面打牌下棋,访问量稳居国内前三。

丁磊是很反对学生创业的。他讲过,世界上只有一个比尔·盖茨。曾经的美食城老板李檬看到这句话,转身就去帮助首都在线做商业化探索了。

探索都是痛苦的。比如上世纪90年代,天王刘德华开始探索自己写歌,老前辈黄霑很快关注到了。霑伯也真不客气,在他自己的专栏里骂了刘德华三年,而且每次都能骂得花样翻新。

刘德华实在受不了了,他找到黄霑说,霑伯,拜托不要骂得那么狠,那么用力。黄霑拍了拍刘天王:

不要放弃,人是会进步的。

当年互联网广告的遭遇还不如刘德华,没有多少广告主啊愿意被贴上粗制滥造、绑架用户的标签。2001年,中国电视的广告额是互联网广告额的50倍。

黄霑有资本骂刘德华,作为广告人,他写出过人头马最经典的广告词:“人头马一开,好事自然来。”作为词作者,他写出过:“沧海一声笑,滔滔两岸潮。”

那是广告人最幸福的时代,孙大伟可以凭“马的内在”系列选举广告帮助马英九击败陈水扁,这种案例,做邮箱和棋牌游戏的互联网人当时想也不敢想。

土生土长的互联网创业者李檬,和当时卖中国黄页的马云一样,做的是教育市场的工作。稍不留心,就会被大公司当成骗子轰出来。

但这个处女座小伙一直没有放弃。这个人走的慢,但从来不后退。

2003年,并称为“中国互联网2.0时代”的博客异军突起。李檬的创业公司也很快被方兴东的博客网盯上、并购。他也加入博客网,担任营销总经理,负责博客网商业产品运营。

卖掉第二个创业公司,李檬拿到一笔现金。他去望京附近看房,当时看的小区一套小户型总价才二十万,首付只要两成。

售楼小姐跟他说,你把这一栋十几户都买了,总共首付也就二三十万。

李檬说你绝对是个骗子,哪有这么卖楼的。销售一听就急了,说哥我给你签担保协议,一年后这房子涨不到20%,这钱我补给你。

李檬心想这更像个骗子了。他最后只花了二十万的全款,买了自己人生的第一套房。

后来有朋友跟李檬说,如果他那时听了女销售的话,买了望京那一栋楼,那早就成为包租公,财务自由了。

之后,也就不会有天下秀敲钟、进胡润榜的事了。

3

许知远并不是第一个觉得时代不精致的人。

2003年10月底,南方周末跑到香港去采访黄霑,香港湾仔福临门酒楼人声鼎沸,霑伯用能压住所有声音的大嗓门跟记者喷了两个人:

金庸和周杰伦。

末了,记者问他如果周杰伦请你写歌,你怎么写。霑伯说没想过,不知道。流行毕竟是年轻人的,你说恋爱,我的初恋离开我都50多年了,不记得了,我老了。

一周后的一个早晨,方兴东起床后登录博客网,发现访问不了。刚开始以为被黑了,后来才发现,是因为访问量增加了十倍。

再一看,他发现三大门户都在头条区推荐了关于木子美的文章。当时木子美在中国博客网上写私生活,但媒体张冠李戴,写成了方兴东的博客网。

于是全中国的网民,都涌进博客网,争相学习如何用身体写作。

霑伯这种老派文人当年也想写色情文学,劝退他的是周星驰:

你必须好好往下写啊,我妈妈特别喜欢你的小说!

这是划时代的事件,中文语境竟然对情色有了一定的包容。

后来木子美和李檬一样,也来到博客网工作。博客广为普及,博客网也很快成为全球中文第一博客网站,流量跻身到Alexa全球网站流量前100位。

过去,不管是门户网站还是传统媒体,都是采编人员做内容,再植入广告。在北京奥运会之后,媒体这种影响力和商业价值,到了巅峰。

但在互联网2.0时代,媒体去中心化了。不管是木子美、芙蓉姐姐还是罗永浩,他们都变成了内容创作者。这些初代网红都聚集了一大批粉丝。

这也是最早的自媒体形态。虽然那时还没有智能手机,博客产品也很简单。但李檬想,如果能将这些有粉丝的内容创作者推向广告市场,中小企业会有更多的营销选择。他隐约感到,颠覆性的市场就要出现了。

2006年,还在华清嘉园搞校内网的龙岩人找上博客网。他要谈一个大合作——借博客网的服务器用用。

当时校内网只发布几个月,用户量就暴增,很快成为最大的中文社交网络。王兴没有钱加服务器和带宽,只好过来博客网借服务器了。

李檬他们说,借服务器可以呀,得两万块钱。龙岩人想了想,咬牙来了一句:

一万八行不行?

博客网当时也不容易。他们坐拥着全网最顶级的流量和“初代网红”——博客主。但当时的环境还是很难变现。

现如今网红们玩的各种手段,李檬当年都干过。比如他跟TCL空调合作进行“初代网红”带货,只要在博客主底下留言,要买TCL空调,家住哪,国美线下就可以提供送货。

几千个人留言要空调。但电话打过去,对方都回复说:

我不买空调,就是为了试一试。

但校内网的大热,让李檬坚定了自己的预感。校内网之后,微博和微信先后诞生了。移动端流量要爆发了,人们接受信息的方式即将被彻底改变。

后来,李檬从博客网离职。嗅到了社会化营销趋势的他,又一次创业,成立了天下秀。

4

2009年,传统广告行业没有经历回光返照。4A公司集体裁员,老大哥奥美打破了祖训,零月费服务伊利。

他们的眼泪并没有浇灌刚成立的天下秀。

那时候大家根本不知道什么是社会化营销,麦当劳在校内网做的小互动案例,还只是学生们上课讨论的范畴,智能手机还没普及,很多老板们根本不知道什么是社交媒体。

石头太多了,李檬一块都没少摸。李檬自己跑销售、盯客户,开发的时候和CTO大半夜在沟通。有一次在介绍自家公司的业务时,被一个企业主当面否定:

你们这个东西不入流,我们是绝对不会做的。

这一次创业,李檬又差点成“先烈”。创业初,天下秀曾几个月发不出工资。A轮时,李檬见了新浪董事长曹国伟,讲了商业计划书。曹国伟对李檬的商业计划书并不是清晰的看好,但觉得李檬这个人和团队还挺靠谱,不久后天下秀收到了一笔四百万美元的救命钱。

当时,新浪微博还在内测中,“网红”这个词还不存在。微博上线后,曹国伟指明方向力排众议,坚定支持天下秀,开发了国内第一个自媒体投放平台——微任务。

到B轮时,李檬找了100多家投资商,还是没人看得懂它的商业模式。一个投资经理说:

网红不就在直播间里给咱哥们唱唱歌,还能做广告发财?

转折点是2010年世博会。他们在微博发起了一个“美好生活@中粮”主题活动,鼓励粉丝随时随地发现中粮产品,引导网友上传分享与世博相关照片。

这个在微博上的品牌活动大获成功。还是陈奕迅的《十年》唱得好:

成千上万个路口,总要有一个人先走。

校内网、开心网、博客网先后都走了,但是自媒体人沉淀下来了,帮助自媒体赚钱的天下秀也成了。骂了比尔·盖茨十几年的李檬,终于站到了风口。

其实,很多复杂或者深奥的道理,最后都可以简化成两个词:准备,时机。

5

2011年前的天下秀,其实与一个传统代理公司无异。

接品牌方的单,找网红、媒体投放,中间挣个差价。资本很快也进来了。天下秀之后又拿到了6亿人民币C轮融资。

沿着这个轨迹,站在风口上的李檬躺着赚钱都行。但他更多是危机感,社交媒体时代,代理商的本质是他们越挣钱,品牌方与媒体方、网红就越亏钱。

我们的价值增量在哪?

创立天下秀第三年,他有了想法,打造一个交易平台——类似于红人新经济领域的阿里巴巴或者Airbnb。

简单说,天下秀不会是一家MCN公司、广告公司或者传媒公司,更不是老魏说的有很多网红和美女资源的“演艺公司”,而是一个红人经济平台。

像住房市场的贝壳连接房源和房客,打车市场的滴滴连接了司机和乘客,外卖市场的美团连接了餐厅和食客,天下秀是连接了红人和商家。

数百个大V、自媒体成了WEIQ平台的第一波玩家。对于那些投不起百度竞价排名、淘宝排名的中小企业来说,WEIQ成为他们打公司品牌提供了更好的选择。

天下秀很快颠覆了中国广告业的原有模式。去年4月,天下秀成功借壳上市;8月25日,这家红人新经济上市公司在上交所举办了敲锣仪式。仪式上,李檬也讲了自己跟曹国伟的会面。

这曾是决定天下秀生死的会面。

一度濒临死亡的小团队,就这样成为敲钟上市的资本市场炸子鸡。天下秀去年市值一度超过了400亿,比陌陌、斗鱼等老牌互联网公司还要高。

李檬押中的赛道还在爆发期。红人经济方兴未艾,李佳琦、薇娅成为新经济的“模范”,一场直播动辄上亿的销售额,堪比一家实体商场一个月的营收。

整个2020年,中国光直播电商业全年带货金额就将近一万亿。他们成为企业主 2019 年以来市场营销的潮流与趋势,被赋予了“新消费风口”地位。

前几天,李檬发布微博视频,他边骑自行车边解读天下秀2020年财报:到去年,WEIQ平台覆盖了图文类视频类直播类等29万职业红人、7500家MCN机构,营收在去年超过了30亿元。视频中,他还对一个卖菠萝的大爷说:

红人的影响力越来越大,你可以试试,不要被时代抛弃。

看完这个视频,我望着煎饼摊愣了很久。原来时代又一次抛弃了我。

今年,盖茨在时隔20多年后又出版了一本名为《气候经济与人类未来》的新书。新书里他说:我是一个乐观主义者,我知道技术的力量,我知道人类的力量。

这些年,盖茨犹如一个章鱼帝一般,1999年书里的十五个预言,如今几乎全部实现了。而当年受他影响而迈入互联网行业的年轻人,如今也偷得了师傅一点真传。

2015年,李檬第一个预判“网红要职业化”,2018年他高喊“红人将会干掉广告公司”,2020年,他说“红人会成为连接一切商业的节点”。如今,国家发布了新的职业。广告公司都在寻求转型,新国货消费品牌都在这样的势头下起来了。

下一步,我就准备让李檬预言下,煎饼摊当然也能上市。

《喜剧之王》有个场景,张柏芝说,看,前面漆黑一片,什么也看不到。周星驰说:

也不是,天亮后便会很美的。

人生这场戏,其实就是一个个选择和坚持叠加起来的总和。选择好,坚持下来,天终会亮。

看看1999年的李想、王兴或者李檬们,你会相信这一点的。


转自:https://mp.weixin.qq.com/s/_717kUhZRcvn3PrLayON0A

两万字总结《C++ Primer》要点

对于想要入门C++的同学来说,《C++ Primer》是一本不能错过的入门书籍,它用平易近人的实例化教学激发学生的学习兴趣,帮助学生一步步走进C++的大门。在本文中,作者Jacen用两万多字总结了《C++ Primer 中文版(第五版)》1-16章的阅读要点,可以作为该书的阅读参考。注:原书更为详细,本文仅作学习交流使用。

第一章 开始

1.1 编写一个简单的C++程序

int main()
{
return 0;
}

每个C++程序都包含一个或多个函数,其中一个必须命名为main.

1.2 初识输入输出

对象用途
cin标准输入
cout标准输出
cerr标准错误
clog输出运行时的一般性消息

1.3 注释简介

两种:单行注释://界定符:/* 和 */

1.4 控制流

while;for;if;
第二章 变量和基本类型
P30-P71数据类型是程序的基础。C++语言支持广泛的数据类型。

基本内置类型

1.算术类型

类型最小尺寸
bool未定义
char8位
w_char_t16位
char16_t16位
char32_t32位
short16位
int16位
long32位
long long64位
float6位有效数字
double10位有效数字
long double10位有效数字

2.类型转换

不要混用符号类型和无符号类型。

变量

1.变量定义

(1)基本形式:类型说明符,随后紧跟着一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。(2)初始值在C++中,初始化和赋值是2个完全不同的操作。初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值来替代。两者区别很小。(3)列表初始化用花括号来初始化变量的方式,称为列表初始化。(4)默认初始化如果定义变量没有指定初始值,则变量被默认初始化。::: tip例外情况:定义在函数体内部的内置类型变量将不被初始化,其值未定义。建议初始化每个内置类型的变量。:::

2.变量声明和定义的关系

变量声明:规定了变量的类型和名字。变量定义:除声明之外,还需要申请存储空间。如果想声明一个变量,而非定义它,需要使用extern关键词。

extern int i;    // 声明i而非定义i
int j;           // 声明并定义j

::: tip变量只能被定义一次,但可以被多次声明。:::

3.名字的作用域

作用域:C++中大多数作用域都用花括号分隔。作用域中一旦声明了某个名字,它所嵌套的所有作用域都能访问该名字。同时,允许在内层作用域中重新定义外层作用域中有的名字。::: warning如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。:::

复合类型

定义:复合类型是基于其他类型定义的类型。

1.引用

引用:为对象起另外一个名字。::: warning引用必须被初始化。引用本身不是对象,所以不能定义引用的引用。引用要和绑定的对象严格匹配。引用类型的初始值,必须是一个对象。:::

2.指针

指针:本身就是一个对象。允许对指针赋值和拷贝。指针无须在定义的时候赋值。(1)利用指针访问对象如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象。(2)void* 指针

3.理解复合类型的声明

(1)指向指针的指针** 表示指向指针的指针*** 表示指向指针的指针的指针(2)指向指针的引用不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。

const限定符

定义:const用于定义一个变量,它的值不能被改变。const对象必须初始化。::: tip默认状态下,const对象仅在文件内有效。当多个文件出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。如果想让const变量在文件间共享,则使用extern修饰。:::(1)const的引用允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。一般,引用的类型必须与其所引用对象的类型一致,特殊情况是表达式。(2)指针和const弄清楚类型,可以从右边往左边阅读。(3)顶层consttop-level const 表示指针本身是个常量low-level const表示指针所指的对象是一个常量。(4)constexpr和常量表达式C++新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。

处理类型

类型别名

两种方法用于定义类型别名:(1)使用关键词typedef

typedef double wages; //wages是double的同义词
typedef wages *p; // p是double*的同义词

(2)别名声明

using SI = Sales_item;  // SI是Sales_item的同义词

auto类型说明符:让编译器通过初始值来推算变量的类型。decltype类型指示符:选择并返回操作符的数据类型。只得到类型,不实际计算表达式的值。

自定义数据结构

(1)类数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。类一般不定义在函数体内,为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应该与类的名字一样。头文件通常包含那些被定义一次的实体。(2)预处理器

#ifndef SALES_DATA_H
#define SALES_DATA_H
#endif

一般把预处理变量的名字全部大写。

术语

空指针 :值为0的指针,空指针合法但是不指向任何对象。nullPtr是表示空指针的字面值常量。void*:可以指向任意非常量的指针类型,不能执行解引用操作。
第三章 字符串、向量和数组
P74-P118string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。

命名空间的 using 声明

using namespace:name;

头文件不应包含using声明。

标准库类型 string

#include <string>
using namespace std;

(1)定义和初始化

string s1;
sting s2(s1);
string s3("value");
string s3 = "value";
string s4(n, 'c');

(2)string对象的操作

s.empty();      // 判空
s.size(); // 字符个数
s[n]; // s中第n个字符的引用
s1+s2; // s1和s2连接
<,<=,>,>= // 比较

::: warning标准局允许把字面值和字符串字面值转换成string对象。字面值和string是不同的类型。:::(3)处理string对象中的字符::: tipC++程序的头文件应该使用cname,而不应该使用name.h的形式:::遍历给定序列中的每个值执行某种操作

for (declaration : expression)
statement

标准库类型 vector

标准库vector表示对象的集合,其中所有对象的类型都相同。vector是一个类模板,而不是类型。(1)定义和初始化vector对象

vector<T> v1;
vector<T> v2(v1);
vector<T> v2 = v1;
vector<T> v3(n, val);
vector<T> v4(n);
vector<T> v5{a,b,c...}
vecrot<T> v5={a,b,c...}

如果用圆括号,那么提供的值是用来构造vector对象的。如果用花括号,则是使用列表初始化该vector对象。(2)向vector对象添加元素先定义一个空的vector对象,在运行的时候使用push_back向其中添加具体指。(3)其他vector操作

v.empty();
v.size();
v.push_back(t);
v[n];

::: warning只能对确认已存在的元素执行下标操作。:::

迭代器介绍

迭代器运算符

*iter            // 解引用,返回引用
iter->mem // 等价于 (*iter).mem
++iter
--iter
iter1 == iter2
iter1 != iter2
iter + n
iter - n
iter += n
iter -= n
iter1 - iter2 // 两个迭代器相减的结果是它们之间的距离
>, >=, <, <= // 位置比较

::: warning凡是使用了迭代器的循环体,都不能向迭代器所属的容器添加元素。:::

数组

(1)数组、指针使用数组下标的时候,通常将其定义为size_t类型。::: warning定义数组必须指定数组的类型,不允许用auto推断。不存在引用的数组。如果两个指针分别指向不相关的对象,则不能进行对这2个指针进行比较。:::

多维数组

多维数组实际上是数组的数组。

size_t cnt = 0;
for(auto &row : a)
for (auto &col : row){
col = cnt;
++cnt;
}
int *ip[4];    // 整型指针的数组
int (*ip)[4]; // 指向含有4个整数的数组

术语

begin string和vector的成员,返回指向第一个元素的迭代器。也是一个标准库函数,输入一个数组,返回指向该数组首元素的指针。end string和vector的成员,返回一个尾后迭代器。也是一个标准库函数,输入一个数组,返回指向该数组尾元素的下一个位置的指针。
第四章 表达式
P120-P151

4.1 基础

重载运算符:为已经存在的运算符赋予了另外一层含义。左值、右值:当一个对象用作右值得时候,用的是对象的值(内容)。当对象被用作左值得时候,用的是对象的身份(在内存中的位置)。

4.2 算术运算符

%:参与取余运算的运算对象必须是整数类型。

4.3 逻辑和关系运算符

&& 运算符和 || 运算符都是先求左侧运算对象的值再求右侧运算对象的值。   
::: warning进行比较运算的时候,除非比较的对象是bool类型,否则不要使用布尔字面值true,false作为运算对象。:::

4.4 赋值运算符

赋值运算符满足右结合律。不要混淆相等运算符和赋值运算符

if (i = j)

if (i == j)

4.5 递增和递减运算符

递增运算符 ++递减运算符 —

4.6 成员访问运算符

点运算符和箭头运算符

n = (*p).size();
n = p->size();

4.7 条件运算符

condition ? expression1 : expression2;

4.8 位运算符

4.9 sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数,其所得值是一个size_t类型,是一个常量表达式。

sizeof (type)
sizeof expr

4.10 逗号运算符

逗号运算符含有两个运算对象,按照从左向右的顺序依次求值。

4.11 类型转换

隐式转换显式转换命名的强制类型转换

cast-name<type>(expression)

// cast-name是static_cast,dynamic_cast,const_cast,reinterpret_cast

::: tip由于强制类型转换干扰了正常的类型检查,因此建议避免强制类型转换。:::

4.12 运算符优先级表

第五章 语句
P154-P1785.1 简单语句(1)空语句

;    // 空语句

(2)复合语句复合语句是指用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称作块(block)。

{}

5.2 语句作用域

定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量就超出其作用范围。

5.3 条件语句

(1)if 语句(2)switch 语句case关键字和它对应的值一起被称为case标签。case标签必须是整形常量表达式。如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非程序显示的中断了这一过程。dedault 标签:如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。

5.4 迭代语句

(1)while 语句

while (condition)
statement

(2)传统 for 语句

for (initializar; condition; expression)
statement

for 语句中定义的对象只在for循环体内可见。(3)范围 for 语句

for (declaration : expression)
statement

(4)do while 语句

do 
statement
while (condition)

5.5 跳转语句

breakbreak只能出现在迭代语句或者switch语句内部。仅限于终止离它最近的语句,然后从这些语句之后的第一条语句开始执行。continuecontinue语句终止最近的循环中的当前迭代并立即开始下一次迭代。gotogoto的作用是从goto语句无条件跳转到同一函数内的另一条语句。容易造成控制流混乱,应禁止使用。return

5.6 try语句块和异常处理

C++中异常处理包括:throw表达式、try语句块。try和catch,将一段可能抛出异常的语句序列括在花括号里构成try语句块。catch子句负责处理代码抛出的异常。throw表达式语句,终止函数的执行。抛出一个异常,并把控制权转移到能处理该异常的最近的catch字句。
第六章 函数
P182-P225

6.1 函数基础

(1)形参和实参:实参的类型必须与对应的形参类型匹配。函数的调用规定实参数量应与形参数量一致。(2)局部对象形参和参数体内部定义的变量统称为局部变量,它们对函数而言是”局部”的,仅在函数的作用域内可见,同时局部变量还会隐藏外层作用域中同名的其他变量。自动对象:只存在于块执行期间的对象。局部静态对象:在程序的执行路径第一次经过对象定义语句时候进行初始化,并且直到程序终止才会被销毁。

size_t count_calls()
{
static size_t ctr = 0;
return ++ctr;
}

(3)函数声明函数的三要素:(返回类型、函数名、形参类型)。函数可被声明多次,但只能被定义一次。(4)分离式编译分离式编译允许把程序分割到几个文件中去,每个文件独立编译。编译->链接

6.2 参数传递

当形参是引用类型,这时它对应的实参被引用传递或者函数被传引用调用。当实参被拷贝给形参,这样的实参被值传递或者函数被传值调用。(1)传值参数(2)被引用传参(3)const形参和实参(4)数组形参为函数传递一个数组时,实际上传递的是指向数组首元素的指针。

void print(const int*);
void pring(const int[]);
void print(const int[10]);
// 以上三个函数等价

数组引用实参:f(int (&arr)[10])

int *matrix[10];   // 10个指针构成的数组
int (*matrix)[10]; // 指向含有10个整数的数组的指针

(5)含有可变形参的数组initializer_list

for err_msg(initializer_list<string> li)

6.3 返回类型和return语句

2种:无返回值函数和右返回值函数。

return;
return expression;

函数完成后,它所占用的存储空间也会随着被释放掉。::: warning返回局部对象的引用是错误的;返回局部对象的指针也是错误的。:::

6.4 函数重载

重载函数:同一作用域内的几个函数名字相同但形参列表不通,我们称之为重载函数。(overloaded)。不允许2个函数除了返回类型外其他所有的要素都相同。重载与作用域如果在内存作用域中声明名字,它将隐藏外层作用域中声明的同名实体。

6.5 特殊用途语言特性

(1)默认实参函数调用时,实参按其位置解析,默认实参负责填补函数调用缺少的尾部实参。

typedef string::size_type sz;
string screen(sz ht = 24, sz wid = 80, char background = ' ');

::: tip当设计含有默认实参的函数时,需要合理设置形参的顺序。一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。:::(2)内联函数使用关键词inline来声明内联函数。内联用于优化规模较小,流程直接,频繁调用的函数。(3)constexpr函数constexpr函数是指能用于常量表达式的函数。

6.6 函数匹配

Step1:确定候选函数和可选函数。Step2:寻找最佳匹配。

6.7 函数指针

函数指针指向的是函数而非对象。

void useBigger (const string &s1, const string &s2, bool pf(const string &, const string &));
等价于
void useBigger (const string &s1, const string &s2, bool (*pf)(const string &, const string &));

第七章 类
P228-P273类的基本思想是数据抽象和封装。抽象是一种依赖于接口和实现分离的编程技术。封装实现了类的接口和实现的分离。

7.1 定义抽象数据类型

(1)this任何对类成员的直接访问都被看作this的隐式引用。

std::string isbn() const {return bookNo;}

等价于

std::string isbn() const {return this->bookNo;}

(2)在类的外部定义成员函数类外部定义的成员的名字必须包含它所属的类名。

double Sales_data::avg_price() const {
if (units_sol)
return revenue/units_sols;
else
return 0;
}

(3)构造函数定义:类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数没有返回类型;构造函数的名字和类名相同。类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数。编译器创建的构造函数被称为合成的默认构造函数。::: tip只有当类没有声明任何构造函数的时,编译器才会自动的生成默认构造函数。一旦我们定义了一些其他的构造函数,除非我们再定义一个默认的构造函数,否则类将没有默认构造函数:::

7.2 访问控制与封装

(1)访问控制

说明符用途
public使用public定义的成员,在整个程序内可被访问,public成员定义类的接口。
private使用private定义的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了类的实现细节。

(2)友元类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。以friend关键字标识。友元不是类的成员,不受访问控制级别的约束。::: tip友元的声明仅仅制定了访问的权限,而非通常意义的函数声明。必须在友元之外再专门对函数进行一次声明。:::

// Sales_data.h

class Sales_data {
friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);
}

// nonmember Sales_data interface functions
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

//Sales_data.cpp

Sales_data
add(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs; // copy data members from lhs into sum
sum.combine(rhs); // add data members from rhs into sum
return sum;
}

// transactions contain ISBN, number of copies sold, and sales price
istream&
read(istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}

ostream&
print(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}

7.3 类的其他特性

(1)重载成员变量

Screen myScrren;
char ch = myScreen.get();
ch = myScreen.get(0,0);

(2)类数据成员的初始化类内初始值必须使用=或者{}的初始化形式。

class Window_mgr{
private:
std::vector<Screen> screens{Screen(24, 80, ' ')};
}

(3)基于const的重载

class Screen {
public:
// display overloaded on whether the object is const or not
Screen &display(std::ostream &os)
{ do_display(os); return *this; }
const Screen &display(std::ostream &os) const
{ do_display(os); return *this; }
}

当某个对象调用display的时候,该对象是否是const决定了应该调用display的哪个版本。(3)类类型对于一个类来说,在我们创建他的对象之前该类必须被定义过,而不能仅被声明。(4)友元友元类如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。

class Screen {
// Window_mgr的成员可以访问Screen类的私有部分
friend class Window_mgr;
}

令成员函数作为友元

class Screen {
// Window_mgr::clear必须在Screen类之前被声明
friend void Window_mgr::clear(ScreenIndex);
}

7.4 类的作用域

一个类就是一个作用域。

7.5 构造函数再探

(1)构造函数的初始值有时必不可少::: tip如果成员是const、引用,或者属于某种未提供默认构造函数的类类型化。我们必须通过构造函数初始值列表为这些成员提供初值。:::

class ConstRef{
public:
ConstRef (int i);
private:
int i;
const int ci;
int &ri;
};

ConstRef:ConstRef(int ii) : i(ii), ci(ii), ri(i){ }

(2)成员初始化的顺序成员初始化的顺序与它们在类定义中出现 的顺序一致。P259(3)委托构造函数使用它所述类的其他构造函数执行它自己的初始化过程。(4)如果去抑制构造函数定义的隐式转换?在类内声明构造函数的时候使用explicit关键字。

7.6 类的静态成员

(1)声明静态成员在成员的声明之前加上关键词static。类的静态成员存在于任何对象之外,对象中不包含任何与静态成员有关的数据。(2)使用类的静态成员

double r;
r = Account::rate();

小结

类有两项基本能力:一是数据数据抽象,即定义数据成员和函数成员的能力;二是封装,即保护类的成员不被随意访问的能力。
第八章 IO库
P278-P290C++语言不直接处理输入输出,而是通过一组定义在标准库中的类型来处理IO。

  • iostream处理控制台IO
  • fstream处理命名文件IO
  • stringstream完成内存string的IO

ifstream和istringstream继承自istreamofstream和ostringstream继承自ostream

8.1 IO类

(1)IO对象无拷贝或复制。进行IO操作的函数通常以引用方式传递和返回流。(2)刷新输出缓冲区flush刷新缓冲区,但不输出任何额外的字符;ends向缓冲区插入一个空字符,然后刷新缓冲区。

8.2 文件输入输出

作用
ifstream从一个给定文件读取数据
ofstream从一个给定文件写入数据
fstream读写给定文件

8.3 string流

作用
istringstream从string读取数据
ostringstream向string写入数据
stringstream既可从string读数据也可以向string写数据
// will hold a line and word from input, respectively
string line, word;

// will hold all the records from the input
vector<PersonInfo> people;

// read the input a line at a time until end-of-file (or other error)
while (getline(is, line)) {
PersonInfo info; // object to hold this record's data
istringstream record(line); // bind record to the line we just read
record >> info.name; // read the name
while (record >> word) // read the phone numbers
info.phones.push_back(word); // and store them
people.push_back(info); // append this record to people
}
// for each entry in people
for (vector<PersonInfo>::const_iterator entry = people.begin();
entry != people.end(); ++entry) {
ostringstream formatted, badNums; // objects created on each loop

// for each number
for (vector<string>::const_iterator nums = entry->phones.begin();
nums != entry->phones.end(); ++nums) {
if (!valid(*nums)) {
badNums << " " << *nums; // string in badNums
} else
// ``writes'' to formatted's string
formatted << " " << format(*nums);
}
if (badNums.str().empty()) // there were no bad numbers
os << entry->name << " " // print the name
<< formatted.str() << endl; // and reformatted numbers
else // otherwise, print the name and bad numbers
cerr << "input error: " << entry->name
<< " invalid number(s) " << badNums.str() << endl;
}

第九章 顺序容器
P292-P332顺序容器为程序员提供了控制元素存储和访问顺序的能力。

9.1 顺序容器概述

类型作用
vector可变数组大小。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。
deque双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。
list双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。
forward_list单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。
array固定大小数组。支持快速随机访问。不能添加或删除元素。
string与vector相似的容器,但专门用于保存字符、随机访问快。在尾部插入/删除速度快。

9.2 容器库概述

一般,每个容器都定义在一个头文件中。容器均定义为模板类。

类型别名
iterator此容器类型的迭代器类型
const_iterator可以读取元素,但不能修改元素的迭代器类型
size_type无符号整数类型,足够保存此种容器类型最大可能容器的大小
difference_type带符号整数类型,足够保存两个迭代器之间的距离
value_type元素类型
reference元素的左值诶性:与value_type&含义相同
const_reference元素的const左值类型(即,const value_type&)
构造函数
C c;默认构造函数,构造空容器
C c1(c2)构造c2的拷贝c1
C c(b, e)构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持)
C c{a, b, c…}列表初始化c
赋值与swap
c1=c2将c1中的元素替换为c2中元素
c1 = {a, b, c…}将c1中的元素替换为列表中元素(不适用于array)
a.swap(b)交换a和b的元素
swap(a, b)与a.swap(b)等价
大小
c.size()c中元素的数组(不支持forward_list)
c.max_size()c中可保存的最大元素数目
c.empty()若c中存储了元素,返回false,否则返回true
添加/删除元素(不适用于array)
c.insert(args)将args中的元素拷贝进c
c.emplace(inits)使用inits构造c中的一个元素
c.erase(args)删除args指定的元素
c.clear()删除c中的所有元素,返回void
关系运算符
==, !=所有容器都支持相等(不等运算符)
<,<=,>,>=关系运算符(无序关联容器不支持)
获取迭代器
c.begin(), c.end()返回指向c的首元素和尾元素之后位置的迭代器
c.cbengin(),c.cend()返回const_iterator
反向容器的额外成员(不支持forward_list)
reverse_iterator按逆序寻址元素的迭代器
const_reverse_iterator不能修改元素的逆序迭代器
c.rbegin(), c.rend()返回指向c的尾元素和首元素之前位置的迭代器
c.crbegin(), c.crend()返回const_reverse_iterator

(1)迭代器标准库的迭代器允许我们访问容器中的元素,所有迭代器都是通过解引用运算符来实现这个操作。一个迭代器返回由一对迭代器表示,两个迭代器分别指向同一个容器中的元素或者是尾元素之后的位置。它们标记了容器中元素的一个范围。左闭合区间:[begin, end)

while (begin !=end){
*begin = val;
++begin;
}

(2)容器类型成员见概述通过别名,可以在不了解容器中元素类型的情况下使用它。(3)begin和end成员begin是容器中第一个元素的迭代器end是容器尾元素之后位置的迭代器(4)容器定义和初始化P290

C c;            // 默认构造函数
C c1(c2)
C c1=c2
C c{a,b,c...} // 列表初始化
C c={a,b,c...}
C c(b,e) // c初始化为迭代器b和e指定范围中的元素的拷贝
// 只有顺序容器(不包括array)的构造函数才能接受大小参数
C seq(n)
C seq(n,t)

将一个容器初始化为另一个容器的拷贝:当将一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型都必须相同。不过,当传递迭代器参数来拷贝一个范围时,就不要求容器类型相同,只要能将要拷贝的元素转换为要初始化的容器的元素类型即可。标注库array具有固定大小:不能对内置数组类型进行拷贝或对象赋值操作,但array并无此限制。P301(5)赋值与swaparrray类型不允许用花括号包围的值列表进行赋值。

array<int, 10> a2={0}; //所有元素均为0
s2={0}; // 错误!

seq.assign(b,e)   // 将seq中的元素替换为迭代器b和e所表示的范围中的元素。迭代器b和e不能指向seq中的元素。swap用于交换2个相同类型容器的内容。调用swap之后,两个容器中的元素将交换。(6)容器大小操作size 返回容器中元素的数目empty 当size为0返回布尔值true,否则返回falsemax_size 返回一个大于或等于该类型容器所能容纳的最大元素数的值(7)关系运算符关系运算符左右两边的元素符对象必须是相同类型的容器。::: tip只有当元素类型也定义了相应的比较运算符,才可以使用关系元素安抚来比较两个容器:::

9.3 顺序容器操作

(1)向顺序容器添加元素表格P305使用push_back:追加到容器尾部使用push_front:插入到容器头部在容器中的特定位置添加元素:使用insert

vector <string> svec;
svec.insert(svec.begin(), "Hello!");

插入范围内元素:使用insert使用emplace操作:emplace_front、emplace和emplace_back分别对应push_front、insert和push_back。emplace函数直接在容器中构造函数,不是拷贝。(2)访问元素P309注意end是指向的是容器尾元素之后的元素。

在顺序容器中访问元素的操作
c.back()返回c中尾元素的引用。若c为空,函数行为未定义
c.front()返回c中首元素的引用。若c为空,哈数行为未定义
c[n]返回c中下标为n的元素的引用,n是一个无符号整数。若n>=size(),则函数行为未定义
c.at[n]返回下标为n的元素的引用。如果下标越界,则抛出out_of_range异常

(3)删除元素

顺序容器的删除操作
c.pop_back()删除c中尾元素。若c为空,则函数行为未定义。返回返回void
c.pop_front()删除c中首元素。若c为空,则函数行为未定义。返回void
c.erase(p)删除迭代器p所指定的元素,返回一个指向被删除元素之后元素的迭代器,如p指向尾元素,则返回尾后(off-the-end)迭代器。若p是尾后迭代器,则函数行为未定义
c.erase(b, e)删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删除元素之后元素的迭代器。若e本身就是尾后迭代器,则函数也返回尾后迭代器
c.claer()删除c中的所有元素。返回void

(4)特殊的forwar_list操作P313befor_begin();cbefore_begin();insert_after;emplace_after;erase_after;(5)改变容器大小reseize用于扩大或者缩小容器。resize操作接受一个可选的元素值参数,用来初始化添加到容器内的元素。如果容器保存的是类类型元素,且resize向容器中添加新元素,则必须提供初始值,或者元素类型必须提供一个默认构造函数。

9.4 vector对象是如何增长的

为了避免影性能,标准库采用了可以减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string通常会分配比新的新的空间需求更大的内存空间。容器预留这些空间作为备用,可以用来保存更多的新元素。容器管理的成员函数:

容器大小管理操作
c.shrink_to_fit()请将capacity()减少为与size()相同大小
c.capacity()不重新分配内存空间的话,c可以保存多少元素
c.reverse()分配至少能容纳n个元素的内存空间。reverse并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间。调用reverse永远不减少容器占用的内存空间。

capcacity和size:区别:容器的size是指它已经保存的元素的数目;capcacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。注意:只有当迫不得已时才可以分配新的内存空间。

9.5 额外的string操作

(1)构造string的其他方法

构造string的其他方法
string s(cp, n)s是cp指向的数组中前n个字符的拷贝
string s(s2, pos2)s是string s2从下标pos2开始的字符的拷贝。
string s (s2, pos2, len2)s是string s2从下标pos2开始len2个字符的拷贝

substr操作:substr操作返回一个string,它是原始string的一部分或全部的拷贝。s.substr(pos, n)  返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值为0。n的默认值为s.size() – pos, 即拷贝从pos开始的所有字符(2)改变string的其他方法assign  替换赋值,总是替换string中的所有内容insert  插入append 末尾插入,总是将新字符追加到string末尾replace 删除再插入(3)string搜索操作

string搜索操作
s.find(args)查找s中args第一次出现的位置
s.rfind(args)查找s中args最后一次出现的位置
s.find_first_of(args)在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args)在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args)在s中查找第一个不在args中的字符
s.find_last_not_of(args)在s中查找最后一个不在args中的字符

(4)compare函数compare有6个版本,P327(5)数值转换P328tostringstod

9.6 容器适配器

顺序容器适配器:stack; queue; priority_queue;适配器是一种机制,能使某种事物看起来像另外一种事物。定义一个适配器:适配器有2个构造函数:1、默认构造函数创建一个空对象2、接受一个容器的构造函数栈适配器:

栈的操作
s.pop()删除栈顶元素,但不返回该元素值
s.push(item)创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造
s.emplace(args)由arg构造
s.top()返回栈顶元素,但不将元素弹出栈

队列适配器:

queue和priority_queue操作
q.pop()返回queue的首元素或priority_queue的最高优先级的元素,但不删除此元素
q.front()                  q.back()返回首元素或尾元素,但不删除此元素。只适用于queue
q.top()返回最高优先级元素,但不删除该元素。只适用于priority_queue
q.push(item) q.empalce(args)在queue末尾或priority_queue中恰当的位置创建一个元素,其值为item,或者由args构造

术语

begin容器操作:返回一个指向容器首元素的迭代器,如果容器为空,则返回尾后迭代器。是否返回const迭代器依赖于容器的类型。cbegin容器操作:返回一个指向容器尾元素之后的const_iterator。
第十章 泛型算法
P336-P371标准库并未给每个容器添加大量功能,而是提供了一组算法。这些算法是通用的,可以用于不同类型的容器和不同类型的元素。

10.1 概述

头文件:algorithm、numeric算法不依赖于容器,但算法依赖于元素类型的操作。

10.2 初识泛型算法

(1)只读算法accumulate  求和equal 是否相等(2)写容器元素的算法算法不检查写操作拷贝算法:copy重排容器元素的算法:sort::: tip标准库函数对迭代器而不是容器进行操作。因此,算法不能直接添加或删除元素:::

10.3 定制操作

标准库允许我们提供自己定义的操作来代替默认运算符。(1)向算法传递函数谓词:谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法的谓词分为两类:1、一元谓词:只接受单一参数。2、二元谓词:接受两个参数。

bool isShorter(const string &s1, const string &s2)
{
retrun s1.size() < s2.size();
}

sort(words.begin(), words.end(), isShorter);

排序算法:stable_sort算法维持相等元素的原有顺序。(2)lambda表达式lamba:lambda表达式表示一个可调用的代码单元。一个lambda具有一个返回类型、一个参数列表和一个函数体。

[capture list](parameter list) -> return type {function body}
// capture list 捕获列表,lambda所在函数中定义的局部变量
// 捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字
// lambda必须使用尾置返回来指定返回类型

(3)lambda捕获和返回两种:值捕获、引用捕获::: warnning当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。一般的,应该尽量减少捕获的数据量,来避免潜在的问题。如果可能,避免捕获指针或引用。:::隐式捕获:当混合使用隐式捕获和显式捕获时,捕获列表中的第一个元素必须是一个&或=。显式捕获的变量必须使用与隐式捕获不同的方式。lambda捕获列表 P352可变lambda:若希望改变一个被捕获的变量的值,必须在参数列表首加上关键字mutable。指定lambda返回类型:当需要为lambda定义返回类型时,必须使用尾置返回类型。(4)参数绑定标准库bind函数:

auto newCallable = bind(callable, arg_list);
// 调用newCallable时,newCallable会调用callable,并传递给它arg_list中的参数

10.4 再探迭代器

插入迭代器、流迭代器、反向迭代器、移动迭代器(1)插入迭代器back_inserter:创建一个使用push_back的迭代器front_inserter:创建一个使用push_front的迭代器inserter:创建一个使用inserter的迭代器(2)iostream迭代器istream_iterator 读取输入流ostream_iterator 向一个输出流写数据istream_iterator操作:

istream-iterator操作
istream_iterator<T> in(is);in从输入流is读取类型为T的值
istream_iterator<T> end;读取类型为T的值得istream_iterator迭代器,表示尾后位置
in1 == in2              in1 != in2in1和in2必须读取相同类型。如果它们都是尾后迭代器,或绑定到相同的输入,则两者相等
*in返回从流中读取的值
in->mem与(*in).mem含义相同
++in, in++用>>从输入流读取下一个值

ostream_iterator操作:

ostream_iterator操作
ostream_iterator<T> out(os);out将类型为T的值写到输出流os中
ostream_iterator<T> out(os, d);out将类型为T的值写到输出流os中,每个值后面都输出一个d。d指向一个空字符串结尾的字符数组
out = val用<<将val写入到out所绑定的ostream中
*out, ++out, out++

(3)反向迭代器反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。

10.5 泛型算法结构

迭代器类别
输入迭代器只读、不写;单遍扫描,只能递增
输出迭代器只写,不读;单遍扫描,只能递增
前向迭代器可读写;多遍扫描,只能递增
双向迭代器可读写,多遍扫描,可递增递减
随机访问迭代器可读写,多遍扫描,支持全部迭代器运算

10.6 特定容器算法

对于list、forward_list,应该优先使用成员函数的算法而不是通用算法。

术语

cref标准库函数:返回一个可拷贝的对象,其中保存了一个指向不可拷贝类型的const对象的引用第十一章 关联容器
P374-P397关联容器支持高效的关键字查找和访问。

类型备注
map关联数组,保存关键字-值对
set值保存关键字的容器
multimap关键字可重复出现的map
multiset关键字可重复出现的set
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希组织的map;关键字可以重复出现
unordered_multiset哈希组织的set;关键字可以重复出现

11.1 使用关联容器

map是关键词-值对的集合。为了定义一个map,我们必须指定关键字和值的类型。

// 统计每个单词在输入中出现的次数
map<string, size_t> word_count;
string word;
while (cin >> word)
++word_count[word];
for (const auto &w : word_count)
count << w.first << " cccurs " < w.second
<< ((w.second > 1) ? " times" : "time") << endl;

set是关键字的简单集合。为了定义一个set,必须指定其元素类型。

// 统计输入中每个单词出现的次数,并忽略常见单词
map<string, size_t> word_count;
set<string> exclude = {"the", "But"};
string word;
while (cin >> word)
// 只统计不在exclude中的单词
if (exclude.find(word) == exclude.end())
++word_count[word]; //获取并递增word的计数器

11.2 关联容器概述

(1)定义关联容器定义map时,必须指明关键字类型又指明值类型;定义set时,只需指明关键字类型。(2)pair类型pair标准库类型定义在头文件utility中。一个pair保存两个数据成员。当创建一个pair时,必须提供两个类型名。

pair<string, string> anon; // 保存两个string
pair<string, string> author{"James", "Joyce"}; // 也可为每个成员提供初始化器

pair的数据类型是public的,两个成员分别命名为first和second。pair上的操作,见表,P380

11.3 关联容器操作

关联容器额外的类型别名
key_type此容器类型的关键字类型
mapped_type每个关键字关联的类型,只适用于map
value_type对于set,与key_type相同;对于map,为pair<const key_type, mapped_type>

(1)关联容器迭代器set的迭代器是const的set和map的关键字都是const的遍历关联容器:map和set都支持begin和end操作。使用beigin、end获取迭代器,然后用迭代器来遍历容器。(2)添加元素

关联容器insert操作
c.insert(v)v是value_type类型的对象;
c.emplace(args)args用来构造一个元素
c.insert(b, e)
c.insert(il)
c.insert(p, v)
c.emplace(p ,args)

(3)删除元素

从关联容器删除元素
c.erase(k)从c中删除每个关键字为k的元素。返回一个size_type值,指出删除的元素的数量
c.erase(p)从c中删除迭代器p指定的元素。p必须指向c中一个真实元素,不能等于c.end()。返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回.end()
c.erase(b, e)删除迭代器b和e所表示的范围中的元素。返回e

(4)map的下标操作

map和unorder_map的下标操作
c[k]返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化
c.at[k]访问关键字为k的元素,带参数检查;若k不在c中,抛出一个out_of_range异常

::: tipmap进行下标操作,会获得mapped_type对象;当解引用时,会得到value_type对象。:::(5)访问元素

c.find(k)  // 返回一个迭代器,指向第一个关键字k的元素,如k不在容器中,则返回尾后迭代器
c.count(k) // 返回关键字等于k的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1
c.lower_bound(k) // 返回一个迭代器,指向第一个关键字不小于k的元素;不适用于无序容器
c.upper_bound(k) // 返回一个迭代器,指向第一个关键字大于k的元素;不适用于无序容器
c.equal_bound(k) // 返回一个迭代器pair,表示关键字等于k的元素的范围。如k不存在,pair的两个成员均等于c.end()

11.4 无序容器

无序容器使用关键字类型的==运算符和一个hash<key_type>类型的对象来组织元素。无序容器在存储上组织为一组桶,适用一个哈希函数将元素映射到桶。无序容器管理操作,表格,P395还可以自定义自己的hash模板 P396

using SD_multiset = unordered_multiset<Sales_data, decltype(hasher)*, decltype(eqOp)*>;
SD_multiset bookStore(42, haser, eqOp);

第十二章 动态内存
P400-P436

12.1 动态指针与智能指针

智能指针用途
shared_ptr提供所有权共享的智能指针:对共享对象来说,当最后一个指向它的shared_ptr被销毁时会被释放。
unique_ptr提供独享所有权的智能指针:当unique_ptr被销毁的时,它指向的独享被释放。unique_ptr不能直接拷贝或赋值。
weak_ptr一种智能指针,指向由shared_ptr管理的对象。在确定是否应释放对象视,shared_ptr并不把weak_ptr统计在内。

(1)shared_ptr类

shared_ptr<string> p1;

make_shared函数:make_shared在动态内存中分配一个对象并初始化它,返回此对象的shared_ptr。

share_ptr<int> p3 = make_shared<int>(42);

shared_ptr的拷贝和赋值:每个shared_ptr都有一个关联的计数器,称为引用计数。一旦一个shared_ptr的引用计数变为0,就会自动释放自己所管理的对象。(2)直接管理内存运算符new分配分配内存,delete释放new分配的内存。使用new动态分配和初始化对象:

// 默认情况下,动态分配的对象是默认初始化的
int *pi = new int; // pi指向一个动态分配的、未初始化的无名对象
// 直接初始化方式
int *pi = new int(1024); // pi指向的对象的值为1024
// 对动态分配的对象进行值初始化,只需在类型名之后加上一对空括号
int *pi1 = new int; // 默认值初始化;*pi1的值未定义
int *pi2 = new int(); // 值初始化为0;*pi2为0

动态分配的const对象:

const int *pci = new const int(1024);

释放动态内存:

delete p;

delete表达式执行两个动作:销毁给定的指针指向的对象;释放对应的内存。(3)unique_ptr某个时刻,只能有一个unique_ptr指向一个给定对象。当unique_ptr销毁时,它所指向的对象也被销毁。

unique_ptr操作
unique_ptr<T> u1
unique_ptr<T, D> u2
unique_ptr<T, D> u(d)
u = nullptr
u.release()
u.reset()
u.reset(p)
u.reset(nullptr)

(4)weak_ptrweak+ptr是一种不受控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象,而且不会改变shared_ptr的引用计数。

weak_ptr 操作
weak_ptr<T> w
weak_ptr<T> w(sp)
w = p
w.reset()将w置空
w.use_count()与w共享对象的shared_ptr的数量
w.expired()
w.lock()

使用weak_ptr之前,需要调用lock,检查weak_ptr指向的对象是否存在。

12.2 动态数组

(1)new和数组在类型名之后跟一对方括号,在其中指明要分配的对象的数目。释放动态数组:

delete p;      // p必须指向一个动态分配的对象或为空
delete [] pa; // pa必须指向一个动态分配的数组或为空

智能指针和动态数组

unique_ptr<T []> u;
unique_ptr<T []> u(p);
u[i];

(2)allocator类标准库allocator类定义在头文件memory中,帮助将内存和对象构造分离开来。

allocator<string> alloc;
auto const p = alloc.allocate(n);
表达式作用
allocator[T] a定义了一个名为a的allocator对象,它可以为类型为T的对象分配内存
a.allocate(n)分配一段原始的、未构造的内存,保存n个类型为T的对象
a.construct(p, args)为了使用allocate返回的内存,我们必须使用construct构造对象。使用未构造的内存,其行为是未定义的。
a.destroy(p)p为T*类型的指针,此算法对p指向的对象执行析构函数

术语

new : 从自由空间分配内存。new T 分配并构造一个类型为T的指针。如果T是一个数组类型,new 返回一个指向数组首元素的指针。类似的,new  [n]  T 分配 n 个类型为T的对象,并返回指向数组首元素的指针。空悬指针:一个指针,指向曾经保存一个对象但现在已释放的内存。智能指针:标准库类型。负责在恰当的时候释放内存。
第十三章 拷贝控制
P440-P486五种拷贝控制操作:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数。拷贝构造函数、移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝赋值运算符、移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。

13.1 拷贝、赋值与销毁

(1)拷贝构造函数拷贝构造函数的第一个参数必须是一个引用类型。

class Foo {
public :
Foo(); // 默认构造函数
Foo(const Foo&); // 拷贝构造函数
}

合成拷贝构造函数:若未定义拷贝构造函数,编译器会定义一个。拷贝初始化:拷贝初始化,要求编译器将右运算对象拷贝到正在创建的对象中。拷贝初始化通常使用拷贝构造函数来完成。(2)拷贝赋值运算符重载赋值运算符:oprator=合成拷贝赋值运算符:若一个类未定义自己的拷贝赋值运算符,编译器会为它生成一个合成拷贝赋值运算符。(3)析构函数析构函数:用于释放对象使用的资源,销毁对象的非static数据成员。

class Foo {
public:
~Foo(); // 析构函数,一个类只会有唯一一个析构函数。
}

在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。销毁类类型的成员需要执行成员自己的析构函数。合成析构函数:当一个类未定义自己的析构函数时,编译器会为它定义一个合成析构函数。析构函数体本身并不直接销毁成员。(4)三五法则P447需要析构函数的类也需要拷贝和赋值操作需要拷贝操作的类也需要赋值操作,反之亦然(5)使用default=将拷贝控制成员定义为=dafault来显式地要求编译器生活才能合成的版本。

class Sales_data {
public:
Sales_data(const Sales_data&) = default;
}

(6)阻止拷贝在函数参数列表后面加上=delete。=delete必须出现在函数第一次声明的时候。析构函数不能是删除的成员合成的拷贝控制成员可能是删除的:如果一个类有数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的。

13.2 拷贝控制和资源管理

(1)行为像值的类为了提供类值的行为,对于类管理的对象,每个对象都应该拥有一份自己的拷贝。类值拷贝赋值运算符:通常组合了析构函数和构造函数的操作。

HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
auto newp = new string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
}

(2)行为像指针的类如果需要可直接管理资源,可以使用引用计数。

13.3 交换操作

swap

13.4 拷贝控制示例

P460

13.5 动态内存管理类

P464

13.6 对象移动

与任何赋值运算符一样,移动赋值运算符必须销毁左侧运算对象的旧状态。(1)右值引用可通过move函数开获得绑定到左值上的右值引用。

int && rr3 = std::move(rr1);

(2)移动构造函数和移动赋值运算符移动构造函数的第一个参数是该类类型的一个右值引用。移动赋值运算符:

StrVec &StrVec::operator=(StrVec &&rhs) noexcept
{

}

合成的移动操作:若一个类定义了自己的拷贝构造函数、拷贝赋值运算符或者析构函数,编译器就不会为它合成移动构造函数和移动赋值运算符。如果一个类没有移动操作,类会使用对应的拷贝操作来代替移动操作。移动迭代器:移动迭代器的解引用运算符生成一个右值引用。(3)右值引用和成员函数::: tip区分移动和拷贝的重载函数通常有一个版本接受一个const T&,而另一个版本接受一个T&&。:::右值和左值引用成员函数:指出this的左值/右值属性的方式与定义const成员函数相同,在参数列表后放置一个引用限定符。P483::: tip如果一个成员函数有引用限定符,则具有相同参数列表的所有版本都必须有引用限定符。P485:::

术语

引用限定符:被&限定的函数只能用于坐值;被&&限定的函数只能用于右值。
第十四章 重载运算与类型转换
P490-P523通过运算符重载可重新定义该运算符的含义。

14.1 基本概念

定义:重载运算符是具有特殊名字的函数。名字由operator和符号组成。重载运算符包含返回类型、参数列表和函数体。::: tip当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的显式参数数量比运算对象的数量少一个。对于一个运算符来说,它或者是类的成员,或者至少含有一个类类型的参数。我们只能重载已有的运算符。:::直接调用一个重载的运算符函数

data1 + data2;
operator+(data1, data2);
// 以上2个调用等价

14.2 输入和输出运算符  

(1)重载输出运算符<<

ostream &operator<<(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.unites_sold << " " << item.revenue << " " << item.avg_price();
return os;
}

(2)重载输入运算符>>

istream &operator>>(istream &is, Sales_data &item)
{
double price;
is >> item.bookNo >> item.units_sold >> price;
if (is)
item.revenue = items.units_sold * price;
else
item = Sales_data();
return is;
}

14.3 算术和关系运算符

(1)相等运算符

bool operator==(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() == rhs.isbn() &&
lhs.unites_sold == rhs.units_sold &&
lhs.revenue == rhs.revenue;
}

(2)关系运算符operator<

14.4 赋值运算符

operator=operator+=

14.5 下标运算符

operator[]下标运算符必须是成员函数。

class StrVec{
public:
std::string& operator[](std::size_t n){
return elements[n];
}
const std::string& operator[](std::size_t n) const{
return elements[n];
}
private:
std::string *elements;
}

14.6 递减和递增运算符

递增运算符(++)递减运算符(–)定义前置递增/递减运算符:

class StrBlobPtr{
public:
StrBlobPtr& operator++(); // 前置运算符
StrBlobPtr& operator--();
}

区分前置和后置运算符:

class StrBlobPtr{
public:
StrBlobPtr operator++(int); // 后置运算符
StrBlobPtr operator--(int);
}

14.7 成员访问运算符

operator*operator->

14.8 函数调用运算符

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。

struct absInt{
int operator()(int val) const {
return val < 0 ? -val : val;
}
};

absInt absObj;
int ui = absObj(i);

如果定义了调用运算符,则该类的对象称为函数对象。

14.9 重载、类型转换与运算符

(1)类型转换运算符类型转换运算符是类的一种特殊成员函数,将一个类类型的值转换成其他类型。形式:operator type() const;(2)避免有二义性的类型转换(3)函数匹配与重载运算符::: warning如果对同一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,将会遇到重载运算符与内置运算符的二义性问题。:::

术语

类类型转换:由构造函数定义的从其他类型到类类型的转换以及由类型转换运算符定义的从类类型到其他类型的转换。
第十五章 面向对象程序设计
P526-P575

15.1 OOP:概述

(1)面对对象程序设计(object-oriented programming)的核心思想:数据抽象、继承和动态绑定。(2)继承:继承是一种类联系在一起的一种层次关系。这种关系中,根部是基类,从基类继承而来的类成为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。虚函数:virtual function。基类希望派生类各自定义自身版本的函数。

class Quote {
public:
std::string isbn() const;
virtual double net_price(std::size_t n) const;
}

(3)动态绑定:::: tip在C++语言中,当我们使用基类的引用(或者指针)调用一个虚函数时将发生动态绑定(也称运行时绑定)。P527:::

15.2 定义基类和派生类

(1)定义基类虚函数:基类希望派生类进行覆盖的函数。基类将该函数定义为虚函数(virtual)。基类通过在其成员函数的声明语句之前加上关键词virtual使得该函数执行动态绑定。关键词virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式的也是虚函数。(2)定义派生类派生类必须通过派生类列表明确指出它是从哪个基类继承而来的。

class Bulk_quote : public Quote {
... // 省略
}

对于派生类中的虚函数的处理:若派生类未覆盖基类中的虚函数,则该虚函数的行为类似其他普通成员。C++允许派生类显式注明覆盖了基类的虚函数,可通过添加override关键字。派生类对象:一个派生类对象包含多个部分:自己定义的成员的子对象,以及基类的子对象。派生到基类的类型转换:由于派生类对象中含有与其基类对象的组成部分,因此可以进行隐式的执行派生类到基类的转换。

Quote item;        // 基类
Bulk_quote bulk; // 派生类
Quote *p = &item; // p指向Quote对象
p = &bulk; // p指向bulk的Quote部分
Quote &r = bulk; // r绑定到bulk的Quote部分。

派生类构造函数:每个类控制自己的成员的初始化过程。派生类首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。派生类使用基类的成员:派生类可以访问基类的公有成员和受保护成员。::: tip派生类对象不能直接初始化基类的成员。派生类应该遵循基类的借口,通过调用基类的构造函数来初始化从基类继承来的成员。:::被用作基类的类:若使用某个类作为基类,则该类必须已被定义而非仅仅声明。派生类包含它的直接基类的子对象以及每个间接基类的子对象。防止继承发生:在类名后面跟着一个关键字final。

class NoDerived final {};   // NoDerived不能作为基类

(3)类型转换与继承我们可以将基类的指针或引用绑定到派生类对象上。静态类型与动态类型:静态类型:在编译时已知,是变量声明时的类型或表达式生成的类型。动态类型:运行时才可知,是变量或表达式表示的内存中的对象的类型。如果表达式既不是引用也不是指针,则动态类型与静态类型永远一致。不存在基类向派生类隐式类型转换:

Quote base;
Bulk_quote *bulkP = &base; // 错误!
Bulk_quote *bulkRef = base; // 错误!

::: warning当我么用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分会被忽略掉。:::

15.3 虚函数

C++的多态性:使用这些类型的多种形式,而无须在意它们的差异。派生类中的虚函数:一个派生类如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。final和override说明符:如果用override标记了某个函数,但是该函数并没有覆盖已存在的虚函数,此时编译器将报错。如果用final标记了某个函数, 则之后任何尝试覆盖该函数的操作都将错误。虚函数与默认实参:如果虚函数某次被调用使用了默认实参,则该实参值由本次调用的静态类型决定。

15.4 抽象基类

纯虚函数:书写=0可以将一个虚函数说明为纯虚函数(pure virtual),纯虚函数无须定义。不能在类的内部为一个=0的函数提供函数体。

class Disc_quote : public Quote {
public:
double net_price(std::size_t) const = 0;
}

抽象基类:含有纯虚函数的类是抽象基类。不能创建抽象基类的对象。

15.5 访问控制与继承

受保护的成员:派生类的成员和友元只能访问派生类对象中的基类部分的受保护成员;对于普通的基类对象中的成员不具有特殊的访问权限。P543公有、私有和受保护继承:派生访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员无影响;对基类成员的访问权限只与基类中的访问说明符有关。派生访问说明符的目的是控制派生类用户对于基类成员的访问权限。改变个别成员的可访问性:通过在类的内部使用using声明语句,我们可以将该类的直接或间接基类中的任何可访问成员标记出来。

class Derived : private Base {
public:
using Base::size;
}

::: tip派生类只能为它可访问的名字提供using声明。:::默认的继承保护级别:使用class关键字定义的派生类是私有继承的;使用struct关键字定义的派生类是共有继承的。

class Base {};
struct D1 : Base {}; // 默认public继承
class D2 : Base {}; // 默认private继承

15.6 继承中的类作用域

在编译时进行名字查找:一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。名字冲突与继承:派生类的成员将隐藏同名的基类成员。::: tip出了覆盖继承而来的虚函数外,派生类最好不雅重用其他定义在基类中的名字。:::如果派生类的成员函数与基类的某个成员函数同名,则派生类将在其作用域内隐藏掉该基类成员函数。::: tip非虚函数不会发生动态绑定。:::

15.7 构造函数与拷贝控制

(1)虚析构函数在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本。

Quote *itemP = new Quote;
delete itemP; // 调用Quote的析构函数
itemP = new Bulk_quote;
delete itemP; // 调用Bulk_quote的析构函数

虚析构函数会阻止合成移动操作。(2)合成拷贝控制与继承基类缺少移动操作会阻止派生类拥有自己的合成移动操作,所以当确实要执行移动操作的时候就要首先在基类中进行显式定义。P554(3)派生类的拷贝控制成员派生类的拷贝或移动构造函数:::: tip默认情况下,基类默认构造函数初始化派生类对象的基类部分。如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显式的使用基类的拷贝(或移动)构造函数。:::派生类的赋值运算符:派生类的赋值运算符必须显式的为其基类部分赋值。派生类的析构函数:派生类函数只负责销毁由派生类自己分配的资源。

15.8 容器与继承

当使用容器存放继承体系中的对象时,必须采用间接存储的方式。因为不允许在容器中保存不同类型的元素。

术语

覆盖:override,派生类中定义的虚函数如果与基类中定义的同名虚函数与相同的形参列表,则派生类版本将覆盖基类的版本。多态:程序能够通引用或指针的动态类型获取类型特定行为的能力。
第十六章 模板与泛型编程P578-P630(1)控制实例化当编译器遇到extern模板声明时,它不会在本文件中生成实例化代码。将一个实例化声明为extern就表示承诺在程序其他位置有该实例化的一个非extern声明(定义)。对于一个给定的实例化版本,可能有多个extern声明,但必须只有一个定义。(2)模板是标准库的基础。生成特定类或者函数的过程称为实例化。(3)术语类模板:模板定义,可从它实例化出特定的类。类模板的定义以关键词template开始,后面跟尖括号对<和>,其内为一个用逗号分隔的一个或多个模板参数的列表,随后是类的定义。函数模板:模板定义,可从它实例化出特定函数。函数模板的定义以关键词template开始,后跟尖括号<和>,其内以一个用逗号分隔的一个或多个模板参数的列表,随后是函数的定义。

转自:https://mp.weixin.qq.com/s/VQURTxhoDzWgPbclBJttNw

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

关注风云之声
提升思维层次
导读
印度觉得死点人没啥大不了的,跑步进入下一世轮回而已。

本文全长9839字

 

我并不喜欢蹭热点,但实在架不住这几天印度事儿太多,一些几百年没联系的朋友也突然间冒出来关心我的近况,与此同时各种各样跟印度有关的信息都涌向我。最多的就是劝我赶紧想尽一切办法回来啊,或者就是让我赶紧囤积物资啊,先囤个三五个月的粮油,备战备荒。
 
可能在很多人眼里,印度现在就是人间地狱,随时要崩溃,甚至说不定就此解体……看热闹从来都不嫌事儿大,所以我觉得有必要把现在我所知道的情况再详细讲一下,上一篇里面有很多内容没有展开。

 

 

 

死亡数据瞒报

 

印度政府的数据有瞒报吗?——不但有,而且很严重。
 
我觉得目前印度公布的死亡人数绝对是有问题的,不可能那么少,因为有些地方真的是死人多到来不及烧。4月22号有个新闻,一个记者在中央邦博帕尔(Bohpal)各个火葬场计数,当天一共烧了187具尸体,里面137具是死于新冠,但政府公布的数据只死了5个人。博帕尔的现存确诊患者11267人,规模只占全印度的0.4%,我们假设博帕尔的死亡人数规模也是0.4%,大家可以反推一下,如果137人只占了全印度的0.4%,那么印度现在实际上每天至少要死3万多人,而印度公布的数据只有2千多人。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

有记者专门在博帕尔的火葬场计数

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

官方数据里博帕尔每天的死亡人数从未超过8人(黑色柱状图)

 

我在德里的一个朋友告诉我了一件刷新我三观的事情:德里由于死人来不及烧,一些火葬场都是几具尸体堆在一起烧,烧完之后家属们各自扒拉一点灰带回家
 
这个我得解释一下,印度教传统人死后大都是火葬,而且出于热带地区原始朴素的防疫意识,有规定白天死的必须日落前烧掉,夜里死的必须日出前烧掉,所以印度烧尸的地方是昼夜不停的。印度人很忌讳尸体放隔夜,现在死人多得来不及烧,就只好几个摞在一块儿烧。你要不想跟别人一起烧,那就得等着。前两天有个新闻,说是人还没死透就被塞进裹尸袋,其实这个挺符合印度传统的——烧尸这件事,赶早不赶晚,早烧早超生
 
烧完尸体扒拉出来的骨灰,最后都会撒到印度教圣地的河里或海里,因为印度教相信大海底下是冥界(这个我在《恒河为什么会成为印度的圣河?(下)水与火之歌》里面写到)。正是因为这个原因,印度人才会不忌讳自己的亲人跟别人撂一块儿烧——反正都是殊途同归撒到同一个地方。瓦拉纳西那地方烧尸河坛,烧完的骨灰会直接推到恒河里,大家的骨灰都混到一块儿,有些人专门站在河里“淘灰”,指望着从灰烬里摸到一些烧化的贵重金属。这种事儿按照我们中国人的传统观念是绝对接受不了的。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

瓦拉纳西烧尸河坛,你中有我,我中有你

 

有人可能要问既然印度人都火葬,那恒河浮尸是咋回事儿呢?其实现在恒河已经没浮尸了,直接往恒河里扔尸体已经被禁止很多年了。按照印度教的传统,据说有6种人不能火葬——貌似包括孕妇、小孩、残疾人之类的,我没有查到具体是哪六种——这些人死后要直接扔河里,这就是过去浮尸的来历。另外,印度的基督徒跟穆斯林都是土葬的。
 
但不管怎么样,几个人撂在一起烧还是相当恐怖的,总让人联想起当年纳粹集中营里的焚尸炉。艾哈迈达巴德(Ahmadabad)火葬场的工人描述说,现在那里就像一条“永无止境的死亡流水线”
 
我查了下,印度2017年的死亡率是千分之7.35,按照13亿人口计算,每年会死9555000人,日均26178人。但根据印度政府的数据,每天死于新冠的人数只有一两千人,就算这些人都是计划外的,也才比平时多死了不到10%的人,原来烧10个人,现在烧11个人,怎么都不至于来不及烧吧?需要几个人撂在一起才来得及烧,那就只有一种可能——现在每天的死亡人数是平时的数倍。但是我们也要考虑到目前只有疫情特别严重的城市才会来不及烧,并非整个印度的普遍现象,那么前面根据博帕尔反推出来的3万死者应该不算太离谱。
 
印度死亡人数瞒报的事实是如此显而易见,《纽约时报》也发起了一个调查,并在4月24号发了一篇题为“As Covid-19 Devastates India, Deaths Go Undercounted”(新冠肆虐印度,死亡人数成迷)的报道,他们估计的实际死亡人数是2到5倍,比我估算得要少一点。真实的死亡人数永远不会有人知道

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

 

死亡人数的瞒报是医院在政府授意下做的,比方说因肺炎死于无法呼吸的病人可以写成“缺氧”,如果病人本身有基础疾病的话那就写死于XX基础疾病……反正不提“新冠”就行了。然后反正尸体当天就烧了,死无对证——要知道即便是在平时,也只有五分之一的死者会有医学死亡报告,80%的印度人都死得“不明不白”
 
印度政府在死亡率这件事情上当然有很大的瞒报动机,死亡率高的话会引起社会恐慌和政治动荡;相反我相信印度的检测数据不会瞒报,因为一方面进行检测可以体现政府在行动,另一方面高检测率和确诊人数可以衬托出低死亡率。之前印度政府一直都把“低死亡率”作为一个政绩的吹嘘点——一开始先是说确诊率很低,确诊人数多了之后又说死亡率很低——多少人确诊没关系,只要这些人不死那就是政府领导抗疫的功劳;但如果死的人多了,那就让政府脸上很难看了。
 
直到现在还有些人认为印度现在之所以会爆发是因为增加了检测数量,为了自圆其说编出各种阴谋论,有的说是反对党为了打击地方选举,故意增加检测;有的说是各地为了抢夺疫苗的优先权,故意把数据搞很惨……
 
这个说法其实有一个显而易见的逻辑漏洞:既然之前印度政府有能力通过减少检测掩盖疫情,或者说可以通过控制检测数量来操纵疫情,那为啥现在不继续操控呢?继续减少检测,疫情不就下来了吗?人心不就稳了吗?我自己生活在印度,之前疫情究竟控制得怎么样还能不清楚吗?这次爆发的原因很简单,就是由于政府破罐子破摔,任由病毒传播复制,进行基因交流,结果养出了一个超级大蛊,一下子翻了车

 

印度疫情二次爆发后,有人问我为什么印度政府会任由人群大规模聚集而不做防范呢?这在我们中国人眼里是无法理解的……但如果你跟我一样过去这一年多都在印度就能明白,印度人也是一步步在作死的边缘试探才走到今天的。去年年底农民抗议的时候,我有点担心:这帮人这样大规模聚集也没人管?难道都不怕死?结果那么大规模的聚集确实没有爆发疫情(假如政府真的能够操纵确诊数据,应该在那个时候让数据爆发出来,把农民吓回家),于是让所有人都放松了警惕,这就好像做了一次“聚集试验”,试验结果是“疫情已经结束了,人群聚集不会有事儿”。后来的大壶节、选举集会的举办都是基于这一“试验结果”,然而万万没有想到的是,超级大蛊已经养成,后来大壶节和选举集会时候的病毒,早已不再是农民抗议时候的病毒……

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

这张图我又要拿出来用一下,对“养蛊”的完美诠释

 

 

潘多拉的盒子

 

接下去来讲讲养蛊的这个事情。
 
我前一篇《“反季节爆发”才是印度当前疫情最可怕的特点》里面说,这个双重突变病毒可以无视抗体所以需要特别警惕(现在已经变成了三重突变)。后来就有个免疫学专家告诉我说:如果已经有了很多携带抗体的人,然而再次感染且症状严重,说明出于某些不可知的原因,接种疫苗可能反而会更容易感染病毒。在做非典疫苗开发的时候就出现了这种情况,当时动物实验时疫苗有可能降低病毒的数量,但是越打疫苗反而越容易感染,且症状极重会导致迅速死亡,因而最终也没敢进行人体实验。
 
具体的致死机制大致是这样的:首先人体有两种免疫系统,一个是先天免疫(Innate Immunity),是存在于我们的细胞机制中的,会对外来入侵者进行无差别攻击,主要的方法就是炎症;另一个是后天免疫(Adaptive Immunity),通过后天习得对病原的抵抗力,我们对病毒的抗体就是靠后天免疫产生的。这两个免疫系统彼此之间相互合作,后天免疫要通过先天免疫来激活,而先天免疫会交接给了后天免疫之后也会下调活跃度。
 
照道理呢,感染过病毒或接种过疫苗之后,后天免疫系统会生成记忆细胞,这些细胞对特定病原体有效,能够快速调动,就好像你解开过的谜题,下次就能又快又好解决。但在某些情况下,我们的身体在第二次感染同一种病毒的时候,先天免疫系统还是会本能地制造炎症给后天免疫发送信号。然而出于某些复杂的原因,后天免疫却迟迟不启动,先天免疫就会采取过激措施,拼命制造炎症以求被后天免疫“看到”;结果后天免疫还没起作用,人体自己就已经被先天免疫制造的炎症杀死了。
 
免疫系统的作用机制非常复杂,总之大概意思就是存在这样一种可能性:有抗体的人反而可能更容易感染变疫病毒,而且症状会更严重。以色列研究机构4月10号公布了一个研究报道说以色列接种辉瑞疫苗后感染南非变种毒株的概率上升了7.5倍,接种率与感染率成正比。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

 

结合上面的免疫学理论,那个免疫学专家就推测,印度现在这个大流行的双重突变病毒,之所以会造成这么严重的后果,保不齐是因为印度之前搞“群体免疫”使人群携带了抗体造成的——我必须强调一下,这目前只是猜测,并没有实验证据,在这里告诉大家只是防患于未然,给大家提个醒,不要接种了疫苗就掉以轻心。结合印度的现状,我认为这种假设有一定的可能性,目前印度确诊人数最多的是马哈拉施特拉邦,但马邦确诊人数最多的城市居然不是孟买,而是一个叫浦那(Pune)的城市,很多人应该都没听过这地方,这座城市的确诊人数仅次于德里,目前是印度第二。然而很巧的是,在之前的印度血清抗体检测调研中,浦那恰恰是抗体阳性率最高的地方——某些地区高达51%。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

血清抗体检测中,浦那独占鳌头

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

这次的二次爆发,浦那依然名列前茅,之前无症状感染的人群惨遭第二波疫情收割

 

先不管上面这些假设和研究的真假,我一直觉得吧,病毒变异这个事情就像掷骰子,只要掷足够多的次数,总有机会掷出6个六。假如觉得有了疫苗就能高枕无忧,放任病毒传播复制,就好像给了病毒无限次掷骰子的机会,迟早会产生一些令人类猝不及防的变异。从这一意义上讲,养病毒比养蛊还吓人,养蛊跑不出蛊盆,病毒养到后来可能会颠覆人类的想象力,可以不断的版本升级进化。由于变异的随机性,人类将永远处于被动境地。导致印度这波疫情的是双重突变病毒可以看做2.0版,据说是从240种变异中“脱颖而出”的;最近发现的三重突变病毒那就是更加强力的3.0版。假如给病毒足够的复制机会,4.0、5.0版本都是早晚的事儿。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

养蛊养出了3.0版

 

潘多拉的盒子已经打开,世界再也回不到从前的模样。

 

 

“士可杀不可辱”

 

双重突变病毒如今把印度杀的措手不及,中国作为唯一一个用尽洪荒之力把潘多拉盒子关上的国家,深知在全球卫生问题上没有一个国家能够独善其身,主动表示愿意给印度提供援助。我们的外交部发言人汪文斌4月22号表示:新冠肺炎疫情是全人类共同的敌人,国际社会需要团结一心、共同抗疫。中方注意到近期印度国内疫情形势严峻,并出现暂时的防疫医疗物资短缺。我们愿为印方控制疫情提供必要的支持和帮助
 
目前印度大城市医疗物资短缺非常严重,直接导致了很多本来不该病死的人病死。印度的疫情热点地图上可以分别看确诊病例和死亡人数的热点气泡,小城市死亡人数的气泡要比确诊人数气泡小,说明死亡率较低;反而是那些大城市死亡人数的气泡比确诊人数气泡大,德里的死亡率明显是最高的,这就充分反映了大城市医疗挤兑的问题。印度目前最缺的就是氧气,现在氧气罐在印度可以当作硬通货使用,价格每天在涨,还出现了打劫氧气罐的情况,以致于氧气罐都得武装押运。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

这是印度现存确诊患者的热点地图

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

死亡人数热点地图,你们会发现死亡率最高的就是德里、孟买、金奈、加尔各答等大城市(黑圈大于蓝圈),这明显是医疗挤兑造成的

 

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

印度的氧气罐需要武装人员看守

 

印度在是否接受中国援助的问题上目前犹豫不决,一些印度网民叫嚣着宁死不要中国援助,甚至把疫情的怨气都撒在中国头上,并且蜜汁自信地表示他们肯定能够“打败”病毒取得胜利——就像我上次说的,只要印度人不死绝,都能算“胜利”;印度媒体则声称中国不在印度寻求氧气设备的国家范围内;至于印度政府还没最后表态,有些扭扭捏捏,估计很纠结,还不想把话说死。
 
印度大概还在眼巴巴地指望着美国伸出援手,说起来印度跟美国简直互为猪队友:美国一开始支持印度制造疫苗,想通过印度疫苗压制中国疫苗,结果却落井下石釜底抽薪,禁止向印度出口疫苗制造原材料。毕竟美国自己独木桥正走到一半,要是去拉印度,说不定被印度给拖下水;美国集团的另外一些国家如加拿大,眼巴巴地等着说好的印度疫苗,前段时间甚至有加拿大友人想飞来印度接种疫苗,谁知道印度给全世界挖了个大坑,本来说好出口疫苗的,现在“出口”的却是可能会突破疫苗的新冠病毒2.0版,全世界都得提防着印度的双重突变病毒倒灌引起第二波疫情。
 
鉴于印度庞大的人口所需的海量资源,目前全世界唯一有能力、有意愿帮印度的国家只有中国。然而接受中国的帮助,对印度来讲有点像用火燎烧伤口——可以起到消毒作用,却也足以让他们的自尊心疼得龇牙咧嘴
 
印度人的自尊心问题我以前在别的文章里讲过,印度斯坦语里面有个词叫做Izzat,类似于“尊严、气节”,经常被印度人挂在嘴边,动不动就说“我的Izzat不允许我这么做”。但我之前没把Izzat的问题说透,这玩意儿到底是怎么来的。最近想通了,Izzat就跟“不吃嗟来之食”、“武士道精神”这些文化现象里的自尊心一样,属于阶级社会的特有产物,从根本上来讲是为了维护自己所在的这个阶级的尊严。这些阶级社会的特有产物看起来挺悲壮的,富于戏剧色彩,实则是文化洗脑害人不浅。中国现在之所以不提“气节”这些东西了,并不是因为人心不古世道堕落,而恰恰是因为社会进步了,过去阶级社会提倡的那套东西吃不开了——就好像日本都已经没有武士阶级了,谁要是再提倡武士道精神动不动就剖腹未免迂腐。
 
可印度依然属于前现代的阶级社会,Izzat这种阶级社会流传下来的观念根深蒂固,比方说婆罗门宁死也不能跟低种姓的人道歉。在印度人的观念里,他们虽然比欧美白人低一等,但比黄种人要高一等。你们别看印度人自己黑不溜秋的,还整天瞧不起黄种人,印度东北地区的那些黄种人在印度会受到歧视。而且印度社会的话语权是掌握在少数上层人手里的,他们会引导下边的人一起歧视中国人。去年印度反华造成的社会影响尚未消弭,突然间要接受中国的帮助,印度人民表示这是对他们“Izzat”的极大侮辱
 
我们中国发生地震、洪水等自然灾害的时候,给我们国际援助的哪怕对方是穷国小国,也从来不会觉得自己低人一等,因为我们考虑问题用的是彼此之间平等的国际主义精神;但印度还是习惯使用帝国主义思维和阶级社会思维来考虑问题,他们觉得自己一旦接受了中国的帮助,那就等于自己是弱者,比中国要低一等,因为只有弱者才需要帮助。印度媒体不忘强调,之前中国给印度的医疗物资,是通过“商业协议”购买来的,以显得自己从未受过中国的“恩惠”。
 
一直以来,中印两个国家的根本矛盾在于对亚洲老大地位的争夺上——在我们看来这根本不是个问题,除了中国还能是谁?但印度不服啊!他们觉得自己至少跟中国是平起平坐的,甚至作为“自由民主”的国家还应该高出中国一头。我最近研究印度近现代史就发现,印度独立前后把一手好牌打烂的根本原因在于死要面子爱吹牛皮,在几件事情上搞得自己骑虎难下,关于这个我过段时间会专门写篇东西来讲。印度这个国家最大的问题就是眼高手低,要是肯放低身段,其实很多问题都可以迎刃而解,可明明是丫鬟的命,却偏偏要做公主,欲望和能力不对等,所以才这么痛苦。
 
印度这种扭曲的心态就导致了把中国的好心当成了驴肝肺,把中国的忍让当成了懦弱。长期以来中国对印度始终是抱着友好态度的,即便1962年中印自卫反击战的目的,也是为了把印度带回到谈判桌上友好解决问题。无奈一山不容二虎(尽管印度根本不是虎),印度在各方面都总是想要压我们一头,可又眼高手低做不到。由于太久没教他们做人,这几年印度民族主义抬头,气焰又嚣张了起来,去年还想趁着疫情落井下石,搞了一通反华操作,中国网友理所当然对印度很不爽,印度疫情二次爆发后,“印度崩溃论”不绝于耳

 

 

经济为重,民为轻

 

那么印度究竟会不会因为这次疫情崩溃呢?——就目前情况来讲,不会。
 
现在虽然印度几个大城市疫情严重,但物资的缺乏主要集中在医疗方面。印度政府吸取了上次封城的教训,保证生活生产等经济活动不中断,尤其是确保物资供应。就目前看来,印度没有生活物资短缺的迹象,印度的出口商甚至还希望本年度农产品出口增长20%。
 
由于病毒的无差别攻击,现在德里孟买的很多富人小区里面也有大量确诊,不像去年那样集中在贫民窟大爆发,所以并没有阶级矛盾激化的迹象。印度有些地方确实出现了贩卖床位、高价倒卖氧气的现象,但一方面政府对这些黑色产业进行了介入打击(虽然可能也是做个样子),另一方面这种情况在印度根本不算个事儿。除了极少数的顶级富豪连夜坐私人飞机逃走,剩下的大部分人都在一条船上,谁也赖不了谁。
 
很多人劝我“想尽一切办法不择手段”的赶紧回国,一来这件事儿的操作难度太大,二来滞留在印度的中国人其实还有很多,我并不比别人更特殊,也不喜欢搞特殊化。前段时间印度疫情好转,大家都以为没事儿了,所以过完年之后很多中企大厂把员工送了回来了;使领馆、央视、新华社的朋友也都在这里坚守阵地,他们身在第一线,比我的风险要大得多;除此之外还有不少困守的家属,都是跟我一样由于家人、孩子在这边……所以我并不是一个人在战斗。
 
我个人觉得既然现在外头那么不太平,最好还是少折腾为妙,在家囤点粮油继续当缩头乌龟,谋定而后动,毕竟我儿子现在连个身份证件都没有,要折腾这些东西免不了东奔西走,徒增风险。我太太说,想想我们算是很幸运的,不用出门上班,那些还要每天上下班的普通人风险多大啊。我说多囤点食物,她说假如连我们家都吃不上饭了,那印度起码已经有一半人饿死了印度有好多家庭根本没存款,吃了上顿没下顿。我觉得,要是印度真的严重到发生人道主义灾难,社会各地动乱,连吃饭都成问题,那使馆肯定会组织撤侨,所以暂时不用急着安排。目前使馆发了通知让在印度的中国公司准备三个月的食物,这应该是按照德里孟买等重灾区的情况建议的。
 
咱们中国人讲的是君子不立危墙之下,现在的情况是不得不立。不少海外游子孤身一人回国已是几经周折,我这么拖家带口暂时还是以不变应万变为好,尽可能做好自我保护,大家就当我是个战地记者好了,只要你们还能有我的消息,就说明我这边的情况还不太糟。同时我也非常感谢诸位的关心及出谋划策,多年之后回首今时今日的际遇,想必会感慨万千。
 
由于印度的新闻自由程度在世界上排名靠后,目前印度媒体的报道是很克制的,或者说是有隐瞒性的,为了不制造恐慌,并没有把一些最糟糕的情况报道出来。但是大家也应该意识到,新闻上会报道的,都是一些极端情况,要是不极端也上不了新闻。如果印度所有的地方都跟新闻上一样,那确实是已经崩溃了。新闻会大肆渲染德里的惨状,但不会告诉你们说印度还有很多地方依然歌舞升平,老百姓们就跟没事儿人一样,大部分地区的社会秩序并没有受到严重影响,比如我们这种泰米尔纳德小三线城市的城乡结合部就是。我太太问我外边怎么样?我说就跟平时一样,大家该干嘛干嘛。这两天大街上戴口罩的人倒是明显多了,因为政府规定必须戴,不戴口罩要罚款。我们泰米尔纳德目前规定每周日封城,于是我周六傍晚出去买菜,结果外面热闹非凡,大家就跟过节似的,原本应该在周日办的事现在都搁在周六提前办,我常去的鱼摊居然破天荒的傍晚还开着,而平时只有上午营业。然后吧,我家附近有个青少年摔跤训练营,几十个孩子还跟平常一样在如火如荼地在开展训练,口罩也不戴,谁都不觉得有什么不妥。不过从4月26号开始,泰米尔纳德邦政府宣布关闭电影院、健身房、公园等场所——政府不下命令,让老百姓靠自觉来防疫是不可能的
 
为啥会这样呢?因为印度人真的不太在乎生死。咱们中国人特别惜命,但印度觉得死点人没啥大不了的,跑步进入下一世轮回而已。
 
在印度经常会听说一些群死群伤的事故,诸如火车压死铁轨上的狂欢群众这样的事故,赔偿金基本上是一口价——50万卢比,合眼下的汇率也就4万3千块钱。换句话说,在印度一条人命也就是四万多块钱的事儿,医闹、碰瓷之类的事情在印度从来没听说过——你就算碰瓷赔上自己一条命,撑死赔给你50万卢比;你要再往上闹没人会理你,所有人都觉得50万卢比已经是非常合情合理的赔偿了——要从印度人口袋里挖出钱来,本来也是一件难如登天的事儿。所以各位如果来印度的话千万要小心别在这儿摊上什么事故,赔的那点钱可能还不够你买机票;相应的,你要是不小心在印度把人弄伤弄死也不用太担心,50万卢比砸过去,就能把人打发走。
 
大家可能听过1984年的印度博帕尔事件,这是人类历史上最严重的工业事故,毒气泄漏造成总共将近2万人死亡(具体人数有争议),1989年工厂赔给了当地政府4.7亿美元,直到事故发生24年后的2008年当地政府才对3787名死者(这个数字是政府认定的)和574366名伤残者进行了赔偿,赔偿金一共支出了3.6亿卢比,每个死者的家庭拿到10000卢比,合2008年的汇率大概是2000人民币。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

政府赔偿金的大头都花在给受害者家庭提供免费食物和牛奶,为啥不直接给现金呢?这其中的猫腻大家都懂的

 

在这个人命贱如草芥的国家,经济比人命重要得多,疫情死点人并不会让印度崩溃,经济崩溃才会。所以现在各邦的态度都很明确——不再进行封锁,保经济,不保人命。而且封城有一个很明显的副作用,封城导致农民工失业返乡,很可能会加速疫情的传播。因此也要进行新闻管制,避免恐慌。
 
由于这种对人命的轻贱态度,在印度死了人一般也不会赖政府,印度政府的甩锅本领一流——疫情最终控制住,那是政府的功劳;你要是不小心在疫情中挂了,那是神的旨意。不是政府让你死的,是神安排你死的。
 
最近确实有控诉莫迪政府抗疫不利、要求莫迪下台的呼声,但这种事情在印度属于常态,主要是指责莫迪之前枉顾疫情组织选举集会。这种多党派民主国家反对党逮着个什么事儿就会攻击一下执政党,反对党的任务是让执政党背锅,执政党的任务则是各种甩锅不认账,说白了不过是政治游戏。印度这个国家历史上天灾人祸就没少过,半死不活人道主义危机的情况时有发生,老百姓早就习惯了逆来顺受。以目前的情况来看,莫迪的威望虽然有所下降,但大部分人还在正常有序地生活,这点星星之火暂时还烧不起来,还动摇不到他的地位。

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

 

【印度日记】印度会因为这次疫情崩溃吗?| 随水文存

 

 

结语

 

我必须强调的是,以上的这些看法只是基于目前的形势,由于世界的不确定性,我无力作出更长远的判断;与此同时,我也无法作任何计划,只能走一步看一步。接下去印度乃至全世界的疫情会如何发展,会不会演变成更大的灾难,现在都不好说……目前已经有了三重突变病毒,之后的四重突变、五重突变的出现只是时间问题,将给世界带来如何的变局尚不可知。
 
我早些时候,曾经有些担心中国全力封锁的政策,心想要是整个世界都死猪不怕开水烫,放飞自我全面开放,走“群体免疫”路子,到时候中国不就成了汪洋大海中的一座孤岛了吗?
 
现在看来,还是国家考虑得远,由于新冠病毒的特殊性,已经证明“群体免疫”永远不会成立——谁能确保自己能对所有的变异毒株都免疫呢?覆巢之下无完卵,掉进大染缸里没人能够独善其身,唯有守好国门才是上策。
人类命运真的是个共同体,某些邻居再怎么膈应,某些霸权主义国家再怎么恶心,大家仍是住在同一个地球上,想不承认都不行,而且也没得选。

 

原本以为2021年的世界不会比2020年更糟糕,现在看来未必。

 

转自:https://mp.weixin.qq.com/s/b40z3mHWNqd8TTprqrX6Lg

中国为什么一定会统一?

前几天有人在群里发了一篇文章,我一看,发现是我一年半前写的一篇文章。自己又回头看了一遍,发现这篇文章很有意义,但是里面也有一些没有说明白的地方,于是又修改了一下,重新发一下。
在第一次世界大战之前,世界有51个国家到了二战之前,世界上共有65个国家左右。
目前,世界上共有193个国家(不含地区,比如香港、澳门、台湾等不算国家,只算地区)。
世界没有变,国家却越来越多,这就说明很多国家都被分裂的非常厉害。
我们中国在一战和二战后也丢掉了一些领土,但是,从历史的角度来看,我们的领土面积总体上是一直在变大的。
在漫长的历史岁月中,我们有强大的时候,也有衰弱的时候;我们的领土有大的时候,也有小的时候。
但是,不管我们的领土是大的时候,还是小的时候,我们绝大多数的中国人都有一个深入骨髓的概念:国家分裂的时候,大家就都想要再次统一;国家衰弱的时候,领土被人抢占了,每个人都想把它再抢回来;国家强大的时候,大家就都想要继续开疆拓土。
为什么会这样?
这是由中国的文化所决定的。

中国为什么一定会统一?

我们先和大家说说中国的领土和统一文化,然后再从地理上和大家说说中国的领土是如何一步步扩大的。
在《礼记·大学》中有这么一句话:“古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身”。
这也就是我们大家熟知的“修身、齐家、治国、平天下”。

中国为什么一定会统一?

据说这句话是孔子说的,也有说是孔子弟子曾参写的,但是不管是谁说的,这句话从战国时期一直流传到现在,并深入了每个中国人的骨髓里。
这句话就包含了我们中国人对国家、对领土的概念。
但是,绝大多数人都不明白这句话的,因为这里面的“家”“国”和“天下”都和我们今天人理解的不一样。
中国的第一个帝国是秦帝国。
在秦帝国之前,人类文明是非常落后的。那个时候的人们以为天是圆的,地是方的,即所谓的“天圆地方”。

中国为什么一定会统一?

地在天的下面,所以称为“天下”。
地,又分为五个方位:东西南北中。
在地的中间就叫做“中国”,住着的是华夏子孙。在华夏的四周分别住着未开化的北狄、西戎、南蛮和东夷。

中国为什么一定会统一?

那个时候,人们认为天是最大的,万事万物都是由天创造的。
地需要有人来管理,所以天就委托一个人来管理,这个人就叫做“天子”。
天子只是一个人,他一个人不可能管得了整个天下,所以他又把领土分给了自己的弟弟、叔叔等。
他的弟弟、叔叔分到一部分地以后,就在彼此的边界处挖一条沟,并在沟的两侧种上树,这就叫做“封”;划定界线以后,就要建立一个国家,这个叫做“建”。
这也被称为“封国土、建诸侯”,简称“封建”。
现在大家知道“封建”是怎么来的了吧。
建立“国”以后,这个国家官职最大的人就做“国君”,也被称为“诸侯”。
也就是说,那个时候,最大的是“天下”,周天子的天下;其次,才是国,国是诸侯的国,是国君的国。

中国为什么一定会统一?

诸侯也不能一个人治理那么大的一个国家吧,所以他也要把自己的领土分给自己的叔叔、弟弟等,他的叔叔、弟弟领到领土后就建成一个“家”。
大家记住了:那个时候的“家”不是我们今天所理解的“家”,那个时候的“家”是一大片的领地,有很多的人。
建立“家”以后,这个家里的最大的人就叫做“大夫”。
大夫的叔叔、弟弟叫做“士”。
到了“士”这个阶层就已经没有土地了,但是“士”可以做官。
“士”下面的叫庶民,也叫做平民。
平民是没有做官的权力的。

中国为什么一定会统一?

我们来看看这个过程:天子、国君、大夫和士其实都是有血缘关系的,这些人都是所谓的“贵族”,都是世袭的。
天子死了,他的长子继承天子之位;国君死了,国君的长子继承君位;大夫死了,大夫的长子继承大夫……
天子把“天下”分给诸侯,诸侯建立“家”。
那个时候,诸侯国的国君都是天子的亲戚,彼此之间都有血缘关系,所以彼此之间矛盾不大。
天子治理“天下”,诸侯治理“国”,大夫治理“家”,都是依靠“礼乐制”(那时还没有法治)。
那么,什么叫做“礼乐制”呢?
所谓的“礼”,我们可以简单的认为是礼仪,衣食住行、贵贱长幼之间要有明显的差别,都要讲究身份和礼仪。
比如,天子该穿什么衣服、国君(诸侯)该穿什么衣服,大夫该穿什么衣服;天子祭天该用什么仪式,诸侯觐见天子该用什么仪式,大夫见国君又该用什么仪式……
就连如何称呼“死”,不同等级的贵族也不一样:

天子——驾崩;

诸侯——薨;

卿大夫——卒;

士——不禄;

平民、奴隶——去世。

在古代,“礼”非常的多,有籍礼、冠礼、大搜礼、乡饮酒礼、乡射礼、朝礼、聘礼、祭礼、婚礼、丧礼等等,这些都有非常详细的规定。

每一个人都要讲“礼”,不能逾越规定。

中国为什么一定会统一?

什么又叫做“乐”?
“乐”就是指音乐。
人的喜怒哀乐之情,都可以通过“乐”来表达,同时也可以在乐声中化解。不同的人享有“乐”的等级也是不一样的。
比如,王必须要用“九鼎”,诸侯只能用“七鼎”,大夫只能用“五鼎”……

中国为什么一定会统一?

简单的说:“礼”负责规范人的行为, “乐”则负责调和人的性情。
在周和春秋的时候,整个社会都是依靠“礼乐制”来维护运行的。
由于那个时候的统治阶级都是亲戚、都有血缘关系,所以“礼乐制”运行的还是不错的,各个诸侯国之间矛盾不大,就算彼此之间偶尔有矛盾,但是也很少有兵戎相见的时候,战争主要是对外的——也就是和北狄、西戎、南蛮和东夷打。
但是,后来发生了两件大事,让整个“礼乐制”崩溃了。
第一件就是“三家分晋”。
那时,晋国的国君是周天子的亲戚,晋国有三个大姓:魏、韩、赵。
这三个大姓把整个晋国分了,成立了三个国家,也就是后来的魏国、韩国和赵国。
按照“礼”中的规定,大夫是不能反国君的,但是韩、赵、魏分了晋国,这就导致“礼”的崩溃。

中国为什么一定会统一?

第二件就是“田氏代齐”。
在战国之前,齐国是姜子牙建立的:姜子牙的女儿邑姜嫁给了周武王,是武王姬发的王后,然后姜子牙帮助武王夺得了天下,武王就给了他一块封地,建立了齐国——那时的齐国被称为“姜氏齐国”。
然后,齐国被田齐给篡位了,叫做“田氏齐国”,这就是所谓的“田氏代齐”——田氏和周天子没有血缘关系。
前面说过,在战国之前的西周和春秋时代,在封建制下的每个诸侯国的国君都和周天子有血缘关系,采取礼乐制,所以相对比较平静。但是,当出现三家分晋和田氏代齐后,这就标志着礼乐制度的彻底崩坏,从那以后,诸侯国之间便没有血缘关系了,彼此之间就不像以前那么讲“礼”,彼此之间为了争夺地盘或利益,经常发生战争。
于是,中原大地进入了“战国”时代。
“三家分晋”被视为春秋之终、战国之始的分水岭。
中国为什么一定会统一?
这些诸侯不断的吞并其它诸侯,最后留下了七个最大的诸侯,这就是我们比较熟悉的“战国七雄”。

中国为什么一定会统一?

战国之前周室以礼治天下,战国以力治天下。
春秋战国,礼乐崩坏,瓦釜雷鸣,刀兵四起,人欲横流,饥者不得食,寒者不得衣,乱者不得治,劳者不得息,征夫无家园,妻儿失暖席,鳏寡无所依,道边人悲啼……
 战国是个乱世,一个疯狂的乱世。
“修身、齐家、治国、平天下”就是儒家在战国时期提出来的。
这句话是针对“士”来说的。
上面我们说过“士”是最低等的贵族、最高等的平民(平民下面还有奴隶),“士”的作用就是做官协助大夫、国君和天子。
当士没有能力做官的时候,只能“修身”,加强学习;当有能力的时候,就帮助大夫治理“家”;当能力再大一些的时候就帮助国君治理“国”;再大一些的时候,就帮助天子治理“天下”——这就是所谓的“修身、齐家、治国、平天下”。
天下只有一个天子,一个国只有一个国君,一个家只有一个大夫,士就比较多了。
平民没有读书和做官的权力,天子、国君和大夫都得依靠“士”,所以“士”就成了天下最有实力的群体。
当每个“士”都把“平天下”当成最高理想的时候,那么无论中国如何改变,最终必将会统一、必将开疆拓土!
诸侯混战,民不聊生,士族都以“平天下”为己任,最终形成了一个统一的王朝。
这个王朝就是秦王朝!
秦,灭了所有的国家,这个时候的秦不能再走回以前的封建老路,否则还会出现战国那样的混乱。
于是,秦终结了封建制!
秦王嬴政灭了六国后,天下只有一个国,于是他就把天下和国合成了一体,就有了“国家”。这时嬴政不能再叫“王”了(因为“王”是诸侯国的称呼),他认为自己的功绩超过了“三皇五帝”,便以“皇帝”自称,于是中国便产生了第一个“皇帝”,所以嬴政又被称为“始皇帝”。

中国为什么一定会统一?

由于分封制导致各个诸侯国常年大战,民不聊生,所以始皇帝就取消了分封制,没有了诸侯,实行中央集权的郡县制
什么叫做“郡县制”?
以前,周天子把土地分给自己的亲戚,那些亲戚在自己的领地上建立诸侯国,那些国的国君死后由嫡长子继承,是世袭的——王无权管理封建领主领地上的事情,封地之下,只认封主。
中国为什么一定会统一?
始皇帝取消了分封制后,那些土地就不再分给自己的亲戚了,而是设立郡和县,自己派官员去治理那些郡县,那些官员都不是世袭的,而是由皇帝任命的。
于是,始皇帝建立了一种新的制度:三公九卿制,集所有大权于自己一身。

中国为什么一定会统一?

在封建社会,权力分散在天子、诸侯手中,但是到了郡县制的时代,权力集中在皇帝一个手中。
从理论上来说,秦朝以后,我们中国就不是封建社会了。
所谓的“封建社会”只是马克思根据欧洲发展史按照生产关系归纳总结出来的,并不适用于中国:欧洲的封建社会采取分封制,生产关系是农民和地主的关系;秦朝的时候,我们采取的不是分封制,而是郡县制,生产关系也是农民和地主的关系。
郡县制结束了封建制,但是土地还是在地主手中。只不过土地从以前的“诸侯、大夫”这些大地主的手中转变到“士族”这些小地主手中而已。虽然这些小地主没有了“建国”的权力,但是土地无疑还是集中在少数人的手中。所以,从生产资料所有权的角度来说,新中国之前,依旧可以叫做封建社会。
秦统一六国以后,国、家和天下合成一个了,没有了诸侯、没有了大夫,于是士族成了权力的核心,协助皇帝治理天下,以前的“治国”“齐家”不存在了,就剩“平天下”了。
“天下”是什么?
天下分为东西南北中,中间的地方叫做“中国”,住着华夏子孙。现在“中国”已经平定了,所以我们还需要向其它的方向扩张,即“平天下”,因为在中国的东西南北方向还有广袤的土地和岛屿。
于是,便有了“开疆拓土”。
下面,我们就来说说中国领土的变化了。
在秦汉的时候,我们的祖先不知道天下有多大,但是知道天下绝对不是我们所在的地方那么大,因为在“中国”的周边还存在广大的山脉、沙漠和海洋等,还存在众多的“南蛮”和“北夷”,所以我们要继续往外“平天下”。
由于古代生产力非常的落后,南方主要是山地,北方主要是草原和沙漠,那些地区文明发展比较落后,所以我们把南方的少数民族称为“南蛮”,把北方的游牧民族称为“北夷”
我们来看看地形图:在地形图上,我们可以看到由燕山、太行山、秦岭和横断山组成一个天然屏障带。当时的秦国就在这条屏障之外,所以在战国的时候,秦国也被其它六国称为“蛮荒之地”。

中国为什么一定会统一?

秦国当然不想住在那个贫瘠的地方,想往中原地区打,占领肥沃的中原地区。
想要占领中原,不是那么容易的。
在秦国的南部有秦岭;东部有黄河,就算渡过黄河后,还有太行山阻挡。
想要逐鹿中原,只有沿着黄河向东打,但是这条路也非常的艰险,有潼关、函谷关、三门峡、雁门关等重要关口,这些关口都是“一夫当关万夫莫开”。

中国为什么一定会统一?

我们来看看函谷关和雁门关,大家就知道有多险要了。
在冷兵器时代,除非己方实力远大于对方,否则想要打下这样的关口实在太难了。

中国为什么一定会统一?

在战国初期的时候,秦国想要“逐鹿中原”实在是太难了。
但是,由于有函谷关、潼关和黄河天险,山东(指崤山以东)六国想要打下秦国也很艰难。
秦国打不出去、山东六国也很难打进来,所以在开始的时候,秦国重点是往北打,一直打到了另外一个天然屏障带——黄河。
在关中平原到黄河之间的这个地区叫做黄土高原,土地也是比较肥沃的。

中国为什么一定会统一?

现在,大家看看秦朝最大的版图,就会知道始皇帝统一六国后的地图为什么会是这样的了。

中国为什么一定会统一?

秦以后,中国又经历了一段时间的内乱,但是最终又统一于汉。
汉朝的时候,中国逐渐强大,又要“平天下”了。
这个时候,就面临这两个问题:是向北扩张,还是向西扩张的问题。
北部就是现在的东三省,那里有广阔的草地,草地非常的肥沃,游牧民族比较厉害,很难打。
再说,就算打下来,对于我们这个农业民族来说,意义也不大,因为那里气候比较寒冷,不适合耕种,也很难建立城池。所以,在汉朝的时候,我们在北方主要采取的是守。
于是,我们把扩张的方向转到了西边。
为什么转到西边?
因为西边相对容易扩张。
在黄河的西边,夹在祁连山、巴丹吉林沙漠和腾格里沙漠中间有一条通道,这条通道就是鼎鼎有名的“河西走廊”。

中国为什么一定会统一?

所谓的“河西走廊”就是在我们今天的甘肃省,也被称为“甘肃走廊”。
这条走廊北部有沙漠保护着,南部有祁连山保护着,易守难攻。
比如,在河西走廊有一个非常著名的关口:嘉峪关。
嘉峪关位于甘肃省嘉峪关市西5公里处最狭窄的山谷中部,城关两侧的城墙横穿沙漠戈壁,历史上曾被称为河西咽喉,因地势险要,建筑雄伟,有天下第一雄关、连陲锁钥之称。

中国为什么一定会统一?

所以,在汉朝的时候,我们就通过这条走廊向西扩张,占领了今天的新疆一带。
现在大家知道汉朝的地图为什么会向下面那样吧:我们重点在河西走廊的北部修建了长城,阻挡匈奴的进攻,然后一路打向西,占领了整个新疆。
所以,新疆在2000多年前就已经是我们的领土了。

中国为什么一定会统一?

那么,能不能再往外扩张了?
在那个时期,很难了,因为那时的新疆离中原核心地带实在有点太远!
新疆是一个“三山夹两盆”的地形:
“三山”指的是北部是阿尔泰山脉、中部是天山山脉,南部是昆仑山脉;
“两盆”指的是北部的准格尔盆地,南部的塔里木盆地,有大量的沙漠存在。
天山将新疆分为南疆和北疆。
中国为什么一定会统一?
汉以后,中国又进入了漫长时间的内乱。
经历了三国时期的魏(魏蜀吴,以魏为正统),后来的晋、南北朝等时期,这段时间内,中国主要是处于内乱时期,忙于内战,被外敌找到可趁之机,我们丢掉了一些地盘。
比如,在三国的时候我们丢掉了新疆和原来黄河以南的一些地区(羌胡),但是在晋朝的时候,我们又把新疆给抢回来了。

中国为什么一定会统一?

在晋朝短暂的统一后,中国再次进入南北朝和五代十国的内斗之中。
中华大地一片混乱!
混战300年后,又统一于隋朝。
隋朝的寿命比较短,只存了38年。
从汉朝到隋朝,这段时间,中国的领土没有得到多大扩张,还丢掉了一点土地(新疆的部分土地)。

中国为什么一定会统一?

随着隋朝的灭亡,紧接着中国开启了一个前所未有的盛世:大唐。
大唐再次开疆拓土,向北我们占领了蒙古高原,一直打到了贝加尔湖以北;西部我们一直打到了中亚地区。
这是中国历史上第一次,也是唯一的一次打到中亚地区。

中国为什么一定会统一?

那个时候,中亚地区也诞生了一个强大的帝国,叫做阿拉伯帝国。
唐帝国和阿拉伯帝国在中亚地区打了一场战争,叫做怛罗斯之战。
怛罗斯战役是一场当时历史上最强大的东西方帝国间的直接碰撞。
这场战争,阿拉伯帝国动用30万人,唐帝国的远征军只有2.4万人,由高仙芝总指挥。
由于兵力悬殊,最终唐帝国只返回了几千人。

中国为什么一定会统一?

虽然唐帝国在怛罗斯之战中失败了,但是并没有动摇大唐在中亚地区的影响力,新疆和部分中亚地区依旧控制在大唐手中。
后来,大唐发生了“安史之乱”,不得不退出中亚地区。
安史之乱,驻守西域的安西都护府的精锐部队都被调往国内平乱,只留下少量的部队驻守西域,吐蕃趁虚而入,攻占西域的大片领土,只剩下安西四镇:碎叶、龟兹、于阗、疏勒。
有传言,李白就是出生于碎叶城。

中国为什么一定会统一?

大唐守军守着4个孤城,顽强的抵抗吐蕃一次又一次的进攻。
由于守军和大唐完全失去了联系,所以直到15年后,守军派出的使者终于到达长安,唐德宗及朝廷上下无不感动的落泪。但,此时朝廷已经自顾不暇,无力救援。
就这样,大唐守军在孤立无援的情况下,坚守了四十年——40年后的龟兹依旧还飘扬着大唐的旗帜。
公元808年,吐蕃大唐守军发动了最后的进攻。
这个时候的唐军,都是坚守了将近半个世纪的老兵,当初年轻的将士皆已是白发苍苍,所有唐军军士挥舞刀剑,发起了最后一次悲壮的冲锋,全部壮烈殉国。
有诗曰:
满城尽白发,死不丢陌刀;
独抗五十载,怎敢忘大唐?
中国银联曾发布一则的微广告《大唐漠北的最后一次转账》,说的就是这段历史,让人落泪。
安史之乱是中华文明前所未有的一次巨大浩劫,这场历时八年,席卷半壁江山的战火不仅成为唐朝的转折点,更是整个中华文明由开放转向保守的转折点。
由于安史之乱,大唐不得不退出中亚地区,让阿拉伯帝国统治了中亚地区,并将伊斯兰文明传入中亚地区。
如果没有安史之乱,那么中亚地区现在可能就是中华文明,而不是伊斯兰文明——现在的中亚地区及新疆的部分地区信仰伊斯兰教就是因为在安史之乱后大唐进入了衰弱期,无力再控制局面。

中国为什么一定会统一?

大唐灭亡后,宋朝诞生。
但是,不幸的是,这个时候,蒙古人强势崛起了。
其实,中国在宋朝的时候也很强大,但是没有办法,碰到了逆天的成吉思汗了。
崖山之战后,宋被灭亡了,这是中国历史上唯一一次,整个国土被完全占领了。
由于蒙古人是游牧民族,文明比较落后,入主中原以后采取高压统治,而且拒绝被中华文明同化,所以很快就灭亡了,只存在了97年。
元灭亡后,中国又诞生了一个强大的帝国——明帝国。
明朝是继汉唐之后黄金时期。
明代无汉之外戚、唐之藩镇、宋之岁币,不和亲、不割地,天子守国门,君王死社稷。

中国为什么一定会统一?

明朝非常强大,也非常繁荣。
康熙皇帝南下金陵时,在耳闻目睹南京城的盛况后对明太祖朱元璋建立的明朝由衷的赞叹之词,评价明朝为“治隆唐宋”、“远迈汉唐”。
意思就是说:明朝的时候,比唐宋的时候还要强大和繁华。
唐朝在最强盛的时候也没有把西藏纳入中国的版图,但是在明朝的时候,西藏被纳入了中国的版图,从那以后西藏就成为中国再也无法分割的一部分。

中国为什么一定会统一?

然而,再强大的帝国也有衰弱的时候。
在明朝的末期,有东林党争、国本之争等重大事件,对外有朝鲜之役与萨尔浒之战。
在内忧外患的时候,吴三桂引清军入关。
明亡!
明朝(1368年―1644年)是中国古代历史上最后一个由汉族建立的大一统中原王朝,共传十二世,历经十六帝,享国276年。
清军入主中原以后并不像元朝蒙古人那样拒绝与汉人同化,相反积极和汉人融合,最终又开启了一个盛世——大清帝国!
我们公正客观的说,清帝国对中国也是有很大的贡献的,因为它是唯一一个同时将新疆和西藏纳入中国版图的一个帝国(不考虑元朝的话)。
当然了,清朝的后期由于闭关锁国,导致我们在近现代遭受了百年屈辱,也丢掉了很多土地。比如外东北和新疆的一些地区。
但是,不管怎么说,清朝也是有很大的贡献的,因为至少新疆和西藏永远的被纳入了中国的版图,成为中国不可分割的一部分。
1911年(辛亥年)10月10日,孙中山先生领导了辛亥革命,清亡!
清朝(1636年-1912年)是中国历史最后一个大一统封建王朝,传十一帝 ,享国276年。
清亡以后,中国进入军阀混战的时期。

中国为什么一定会统一?

1926年7月9日,广东国民政府领导的国民革命军十万人正式出师北伐,发动了针对北洋军阀的革命战争也被称为“北伐战争”。
在苏联军事顾问的帮助下,北伐军制定了正确的行动方针,首先向军阀吴佩孚部队盘踞的湖南、湖北进军。共产党人叶挺领导的、以共产党员为骨干组成的第四军独立团是北伐先锋。
北伐战争沉重地打击了帝国主义和北洋军阀在中国的统治,基本消灭了北洋军阀,为以后中国新民主主义革命的发展开辟了道路。
然而,在1927年4月和7月的时候,蒋介石和汪精卫先后在上海和武汉发动反革命政变。北伐战争的胜利果实被窃取。

 

1931年,日军在东北发动“九·一八事变”,开启了侵华战争。

随后,国共两党斗争中有合作,经过十几年的抗战,终于取得了抗日战争的胜利。

1945年8月15日,日本裕仁天皇向全日本广播,接受波茨坦公告、实行无条件投降。

抗日战争结束,国共之间矛盾升温,国民党一边假意和谈一边积极抢占地盘,准备发动战争。

1945年8月至1949年9月,中国共产党带领全国人民发动了解放战争,并取得了最终的胜利。

1949年10月1日在新中国成立,国民党战败后逃往台湾。

新中国成立以后,中国人民在共产党人的领导下,通过艰苦卓绝的奋斗,只用了短短的70年的时间,就把一个“一穷二白”的国家发展到世界第二大经济体。

今天,我们仍然在不断的前进。

可以预料的是,在不久的将来,我们必将会成为世界第一。而埋藏在每个中国人血脉深处“平天下”的思想,必将引领我们创造更大的辉煌!

曾经失去的,我们一定都会拿回来!

不仅仅要拿回来,我们更要创造新的历史!

努力吧,每个中国人!

—–全文到此为止。

转自:https://mp.weixin.qq.com/s/G_wYn1EeaGXQICZTyakIaw

外资和公募最新股票池(2021年二季度)

 

股市有风险,投资需谨慎;

专注大趋势,不负好时代。

 

投资股市赚钱,比拼的是认知、耐心和风险承受能力。

 

在认知方面,外资和公募研究能力总体来说是最强的。所以,我一直提倡大家抄作业,“君子善假于物”。

 

感谢这个时代,信息比较透明。我曾经答应过大家,每个季度更新一次外资和公募的最新持仓,方便大家在优秀的上市公司范围内,用趋势的方法找切入点。

 

以下是两份持仓表格。左边栏目是持仓总市值,右边栏目是持仓占流通股的比例,敬请各位老板和老板娘收藏。

 

外资和公募最新股票池(二季度)

外资和公募最新股票池(二季度)

 

然后周末有个新闻,一位大妈2008年买入5万元长春高新,后来出国忘记股票账户密码,现在变成了500万,13年时间赚了100倍。

 

对于这个新闻,我最关注的点不是选中这么好的股票有多难,概率有多低,而是人家至少整整持有了13年(虽然她这个长期持有是被动的)。

 

炒股十几年,我也曾经买过不少好股票,包括老朋友都知道的“非卖品”爱尔眼科等,但最终都没赚到太多的钱。主要原因,就是拿不住。所以近几年,我操作周期越来越大,关注的趋势级别也越来越大。

 

我还算好的。很多朋友只能长期拿住亏损的股票,一点都拿不住有盈利的股票。这样更不好。

 

长期持有一支股票的最大风险,是没有确定性。比如大妈买的是长春高新还好,如果买的是中国石油,到现在就亏得连一万块钱都不到了对吧。

 

但是,现在确定性来了:如果把地球上的国家都看作是一个个上市公司,那么我们中国,无疑是其中成长性确定性最强的,甚至没有之一。

 

所以我建议投入股市的钱,有一半坚定持有指数ETF,要拿很久很久那种。先保证赚到这个基础收益,再用一半仓位去尝试做更高的收益。

 

这段内容,对应了文章开篇第一句中说的耐心。耐心等待A股越来越好。

 

最后是风险承受能力,主要是老生常谈的“用余钱投资”,再有就是,要敢于拥抱波动。

 

巴菲特老爷子持有比亚迪,2008年8港币买入,一年时间翻了10倍,随后又一年时间跌回9港币跌了将近90%,再后来几番起起伏伏,到如今13年赚了20倍。

 

我们不说这个极端的例子,就说A股近10年所有翻了10倍的股票,你随便选一个打开K线看看,没有过程中波动很小的,每隔几年有个30%以上的回撤很正常。因此,如果过于拒绝波动,也很难有好的收益,会付出不少交易的磨损成本。

 

根据《中国基金报》报道的最新数据,今年一季度,90%的QDII基金保持高仓位运作,权益资产占8成以上的仓位。外资他们不太关心股价波动,默默埋头反而取得了很不错的收益。

 

最最后说说市场行情:

 

上周市场大幅反弹,但是成交量没有同步放大多少。我和一些朋友的股票类公众号阅读数、互动数,前段时间也一直比较低迷,到现在都没有恢复。这说明,大部分交易者可能还没回过神来,加上上周的赚钱效应,所以“五一”小长假前,行情有望延续反弹。

 

有朋友可能要问,奶爸你的公众号阅读数、互动数反映了市场情绪,是不是可以拿来作为反向操作指标,人气低迷时买入,人气高涨时卖出?这个其实很难,因为不知道低迷到什么时候反弹,高涨到什么时候高潮戛然而止。只是回头去看,往往能显示出阶段性的底部和顶部区域。

 

市场总体趋势评分:8.2分(多头区间);阶段最强指数:创业板指、中证500。

 

这里有一个小的现象值得注意,就是:这段时间中证500指数虽然涨幅不大,但是悄无声息取得了8连阳,是几大主要指数里唯一的一个。所以虽然涨幅不大,我也把它列为了最强指数。

 

目前的一个小风险,是印度新冠疫情好像有点失控,已经出现单日新增35万确诊病例的情况,并且病毒有所变异。德国开始宣布,将禁止除德国公民以外的人士从印度入境。

 

所以在操作上,可以先继续看几天,等本周下半周再看,“五一”小长假前是不是需要降低仓位来稍微控制下短期风险。

转自:https://mp.weixin.qq.com/s/UrAZMxeh8B4tS1hHyqFeYw