三年经验c++程序员所不应该犯的错误

    这里只说c++语言技能。因为不同的开发者平台不同,方向不同,所以 依赖于编程环境的一些问题暂且不说,只说说所有c++程序员都应该避免的错误。


    如果你是一个三年经验的c++ coder,不妨对比看一看,如果自己身上出现了这些问题,还真要好好反思反思了。如果你是一个c++ leader,而你手下的三年经验的小伙伴恰好有出现这些错误的,那你应该考虑是不是应该让他领盒饭了,或者委婉点把这篇文章转给他看看吧。


    进入正题。


1 对基本类型的特质理解不清。比如,

1)误以为使用int64类型模拟float能够扩展数值的取值范围,其实因为表示数据的方式的原因,float和double的取值范围比int64大得多,只是

表示大数据的时候会有精度丢失(这也与其表示数据的方式有关系)。

2)signed和unsigned使用场合,一个典型的使用错误与size_t有关,其实size_t就是unsigned int/unsigned int64,是不带符号的。但仍旧有很多人犯这样的错误:

for(size_t i = vct.size(); i >= 0; --i)
{
    //......
}
因为unsigned 不可能小于0,所以这里会出现一个死循环。


2 混淆if和#if
这只是一方面,其实这类问题可以统一归结为区分编译期和执行期问题,还有比如混用"#define"和enum枚举值,宏的错误使用,分别举个例子:
enum emVersion
{
    VERSION_ALPHA,
    VERSION_BETA,
};

#define VERSION  VERSION_ALPHA

#if VERSION == VERSION_ALPHA
//...
#elif VERSION == VERSION_BETA
//...
#endif

#define PROCESS_VAR(u,var)					\
	if(typeid(var) == typeid(int))			\
		u.u1 = var;							\
	if(typeid(var) == typeid(std::string))	\
		u.u2 = var;							\
	if(typeid(var) == typeid(double))		\
		u.u3 = var;

void func()
{
	std::string a = "ssfasdf";
	U u;
	PROCESS_VAR(u, a);
}
第二个例子的解析:想法是当不同的类型执行不同的分支,但是运行期的分派控制前提是要保证编译期能够编译通过,对于强类型的c++语言,这种写法是不能通过编译的,解决方法是使用函数重载,模板特化,或者使用c风格,通过viod*指针过渡,类型强转。


3 不清楚最基础的stl容器的用法,不能根据场景选择合适的容器
其实在面试中也有很多面试官会问到stl容器的区别,应该在什么场景选用什么合适的容器,最常需要作出选择的容器是vector,list,set,还有如c++11新加入的array,新的c++标准也带来了map和unordered_map之前的使用权衡,相对而言,其他容器的使用场景更加的清晰单一。容器的选择依据主要是底层数据结构和内部算法等。


4 不会灵活使用迭代器

stl中的迭代器是一种应用很广泛的数据类型,而其本身也是被总结成为一种设计模式,核心思想是隐藏不用容器内部的数据组成和遍历规则,只是提供一个统一的访问方式提供给使用客户。但是stl中的迭代器种类也很多,正向,逆向,顺序,随机,普通类型,常量类型,以及各种类型的使用场景,转换操作等,都应该需要掌握。

for (auto it = mymap.begin(); it != mymap.end(); ++it)
{
	if (it->first > 5)
		mymap.erase(it);
}

5 不熟悉自己的editer/ide

由于不同的工作平台以及其他原因(例如个人信仰问题),不同的人可能用着不同的开发环境,配置着不同的操作放肆,但是不论怎样,一个稍有经验的程序员都应该有一套让自己写起代码来得心应手的家伙事,所以打造适合自己的编程环境或者适应自己的编程环境尤为重要,而不应该在自己才思如泉涌的时候却卡在鼠标键盘前变不了现。



6 不会使用基本的正则表达式

不管你是windows程序员还是linux程序员,基本的正则表达式都是应该掌握的,正则表达式在编程中的使用远远高于你所以为的,而不简单只是使用regex库而已,比如在涉及到代码重构的时候,别人一个正则替换就解决的问题,你却要花上几个小时甚至一两天的时间来完成机械的人肉查找替换操作。

说到正则表达式,其实也只是拿它来当做一个引例而已,所要表达的意思是,程序员之间的差别并不是在语法熟悉和运用上面,能够利用语言本身以外的任何东西提高自己的工作效率本身也是一个优秀程序员的应该具备的品质。


7 不会使用lambda表达式
lambda表达式出现于c++11标准,到现在也已经6年了,而新的c++17标准也在路上了,除了一些工作性质特殊使用老旧编译器而没有办法接触新标准的伙伴们除外,有一定经验的程序员都应该需要理解并会使用大部分的c++11特性,而lambda表达式应该是c++11中普及最广的特性之一。

8 不熟悉常用的设计模式

作为一个有一定经验的程序员,常用的23中设计模式起码也应该听到名字就能想起来是用来干嘛的。所谓设计模式都是在总结前人的经验的基础上形成的一套开发框架,成熟,健壮,易扩展,易维护。熟悉设计模式对自己的提升是很明显的,当然前提是你对面向对象,面向接口等基本的规范有个清晰的认识。


10 不清楚pod和非pod类型之间的区别,滥用不支持序列化的类作为持久化数据结构
很多很有经验的程序员还会犯如下的错误:
struct serialize_proto_datatype
{
	int id;
	std::string proto_data;
};

void cls::copy(const serialize_proto_datatype& data)
{
	memcpy(&m_data, &data, sizeof(m_data));
}

void cls::serialize()
{
	fwrite(&m_data, sizeof(m_data), 1, fp);
}
void cls::deserialize()
{
	fread(&m_data, sizeof(m_data), 1, fp);
}
然后程序就莫名其妙出现崩溃了。。

11 不能灵活应用面向对象思想

"面向对象"是什么意思,着大概是多数c++程序员,尤其是刚出校门的准程序员面试时会被问到的最多的问题,c++的面向对象从代码上看体现在相对于c语言的数据结构变化上,但是面向对象的思想绝不仅仅只是体现在数据结构上,不然也不能够配上“思想”这两个字了。所以也有人说学c++简单,学会c++难。但是对于一个有一定经验的c++程序员来说,起码在敲代码之前需要在脑子里转几圈,自己的代码是不是符合自己“资深开发”的头衔。当然,能不能灵活应用“面向对象”思想从coder的代码水平上就能一目了然了,模块划分是否清晰,依赖是否合理,耦合性控制是否得当,重用性是否够高,扩展性是否够好… 如果一个coder的代码到处都是copy paste的相同或者相似代码块,到处都是“飞线”,代码看起来就像是干了水的面条,一坨戳都戳不开,那么很显然他没有达到这条要求。


12 不能宏观把控代码模块结构,编写的模块依赖混乱
这条和上面一条所说的类似,但又略有不同。不光是面向对象,更是从整个架构的眼光去全局思考。之所以同一个点列出两条,是为了足够体现出这种能力对于一个程序员来说多么重要。

13 乱用函数参数类型
const Type& mycls::GetSomeMember() const;

如果说你的资历适合看这篇文章,但是你又没分清这个函数申明的const是何意义,那么祝贺你,能在你的岗位上这么久没有被轰走真的是一大奇迹。其实大部分人都应该知道这里括号后面的const是什么意思,但是依然有很多人在代码中并不care。

bool serialize_vct(std::vector<MyType> vct);
如果说上面的那个const可以容忍的话,那么这种写法一定不能容忍,上面一种写法只是会造成隐患,而现在这种写法则是完完全全会影响代码执行的性能。

14 乱用public private protected
这三个东西是c++很基础的东西,大部分不适用多态的情况下我们使用public和private,在使用多态的情况下一般使用public和protected,使用public继承。如果你在使用的时候恰好忘了一些细微区别其实也没有多大影响,百度谷歌随便搜搜都有详细解答,但是如果自己都模棱两可还是不要随便乱用的好。

15 不会用多态虚析构函数
经常看到有存在多态性的代码中,基类析构函数没有写成virtual,而这也是很多资源泄露的根源所在。

16 不理解extern "C"

如果不涉及到手动加载,或者不需要考虑兼容C语言的话,其实用到比较少。但是这也属于语言原理的问题范畴,如果不了解真的也是说不过去,当然不光要了解它是用来干嘛的,还需要了解它的使用方式和注意事项。


--------------------------------------------

欢迎补充  ^_^

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值