首页 南通站 南通科迅教育 C++学习心得方法分享
南通科迅教育 136篇文章 1360次浏览
致力于培养面向设计及开发领域的高端人才,以学员就业为目的!
立即咨询

C++学习心得方法分享

南通科迅教育 2020-03-20

  C 是一门被广泛使用的系统级编程语言,更是高性能后端标准开发语言;C 虽功能强大,灵活巧妙,但却属于易学难精的专家型语言,不仅新手难以驾驭,就是老司机也容易掉进各种陷阱。
  对C 语言的一些高级特性,做了简单介绍;对一些常见的误解,做了解释澄清;对比较容易犯错的地方,做了归纳总结;希望借此能增进大家对C 语言了解,减少编程出错,提升工作效率。
  一、程序里用了全局变量,但为什么进程正常停止的时候会莫名其妙的core掉?
  Rule:C 在不同模块(源文件)里定义的全局变量,不保证构造顺序;但保证在同一模块(源文件)里定义的全局变量,按定义的先后顺序构造,按定义的相反次序析构。
  我们程序在a.cpp里定义了依次全局变量X和Y;
  按照规则:X先构造,Y后构造;进程停止执行的时候,Y先析构,X后析构;但如果X的析构依赖于Y,那么core的事情就有可能发生。
  结论:如果全局变量有依赖关系,那么就把它们放在同一个源文件定义,且按正确的顺序定义,确保依赖关系正确,而不是定义在不同源文件;对于系统中的单件,单件依赖也要注意这个问题。
  二、编译器为什么不给局部变量和成员变量做默认初始化?
  因为效率,C 被设计为系统级的编程语言,效率是优先考虑的方向,c 秉持的一个设计哲学是不为不必要的操作付出任何额外的代价,所以它有别于java,不给成员变量和局部变量做默认初始化,如果需要赋初值,那就由程序员自己去保证。
  结论:从安全的角度出发,定义变量的时候赋初值是一个好的习惯,很多错误皆因未正确初始化而起,C 11支持成员变量定义的时候直接初始化,成员变量尽量在成员初始化列表里初始化,且要按定义的顺序初始化。
  三、std::sort的比较函数有很强的约束,不能乱来!
  如果要用,要自己提供比较函数或者函数对象,一定搞清楚什么叫“严格弱排序”,一定要满足以下3个特性:
  非自反性
  非对称性
  传递性
  尽量对索引或者指针sort,而不是针对对象本身,因为如果对象比较大,交换(复制)对象比交换指针或索引更耗费。
  四、注意操作符短路
  考虑游戏玩家回血回蓝(魔法)刷新给客户端的逻辑。玩家每3秒回一点血,玩家每5秒回一点蓝,回蓝回血共用一个协议通知客户端,也就是说只要有回血或者回蓝就要把新的血量和魔法值通知客户端。
  玩家的心跳函数heartbeat在主逻辑线程被循环调用:
  void GamePlayer::Heartbeat { if (GenHP || GenMP) { NotifyClientHPMP; } }
  如果GenHP回血了,就返回true,否则false;不一定每次调用GenHP都会回血,取决于是否达到3秒间隔。
  如果GenMP回蓝了,就返回true,否则false;不一定每次调用GenMP都会回血,取决于是否达到5秒间隔。
  实际运行发现回血回蓝逻辑不对,Word麻,原来是操作符短路了,如果GenHP返回true了,那GenMP就不会被调用,就有可能失去回蓝的机会。OMG,你需要修改程序如下:
  void GamePlayer::Heartbeat { bool hp=GenHP; bool mp=GenMP; if (hp || mp) { NotifyClientHPMP; } }
  逻辑与(&&)跟逻辑或有同样的问题, if (a && b) 如果a的表达式求值为false,b表达式也不会被计算。
  有时候,我们会写出 if (ptr !=nullptr && ptr->Do)这样的代码,这正是利用了操作符短路的语法特征。

免责声明:机构动态部分文章信息来源于网络以及网友投稿,本网站只负责对文章进行整理、排版、编辑,是出于传递 更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。
请输入您想学的课程
请输入您的姓名
请输入您的手机号
立即选课
30分钟内已有50人预约试听课程