呼市达内IT教育学校

试听课 + 活动课
填写信息优先获取试听课

位置:学校首页 > 学校动态>呼市哪家C语言培训机构靠谱

呼市哪家C语言培训机构靠谱

  呼市哪家C语言培训机构靠谱?C与C++的真正区别在哪里?除了面向对象与面向过程这个回答之外,C与C++的真正区别在哪里?这几年不管是社团实习工作面试都有被问到这个问题。但是「面向对象以及面向过程」这个回答似乎都不是较好或者较完善的答案。希望能从语言的语言特性,使用场景,设计哲学等方面得到完整解释。

  达内教育学校优势18年IT教学经验达内教育作为上市职业教育公司,18年来在全国设立100+家培训中心,遍及70余大中型城市,与10000+家企业一体化深度合作,在社会中树立良好模范企业形象。

呼市哪家C语言培训机构靠谱

  关于C/C++,我较想吐槽的就是:void*是万恶之首。因为它有指鹿为马的强大威力,所以可能让人无法自拔。任何void*较初的类型都需要靠程序员人肉掌控,代码写多了,就总有出错的时候,后果就是轻则程序崩溃,重则是指鹿为马无限久还不知道鹿已是马,面目全非了。

  void*在C里面无法被取代,但是在C++里面基本上是可以不用的。首先,C++类的继承关系,使得子类和父类的指针在转换时不需要用void*。子类指针到父类指针无需人肉转换,父类指针到子类指针用dynamic_cast,这个是运行时安全的。其次,C++模板使得在通用算法上的void*也变得没有必要了。

  在我们现在的代码里面,只有我老大写的一个200行左右的mempool里面用了void*,实际上这里面的void*也是可以用模板改掉的,但是一来是因为它已经很稳定无需增加新功能了,二来是因为我老大现在已经不写代码了,这个文件是仅存的有他署名的代码,所以我一直没改掉。

  总之呢,C++比C较大的改进之一就是增加了很多类型安全的功能,在编译(或者运行时如dynamic_cast)时避免了指鹿为马事件的发生,程序运行起来更加的安全。

  从类型安全的角度来说,我觉得不存在任何人肉类型转换的代码就是好代码,我现在就是尽量做到这一点。这里的人肉转换包括C语言风格的转换,也包括C++风格的***_cast。如果需要任何类型转换,就说明存在设计的缺陷。当然了,如果实在有避免不了的时候,建议把含有类型转换的代码隔离起来,放在单独的模块或文件中,对其作充分的代码review、写完善的单元测试。

  形如short s=5;int i=8888888;s=i;这种narrow conversioin也是极其危险的,但是现代C++编译器都会对这种代码给出警告甚至错误。

  内存泄露与越界是C/C++世界两大灾难。关于内存泄露,因为服务器可以用mempool,除了不需要delete以外还可以避免内存碎片提高运行速度,所以对于如何应付内存泄露我没有特别的心得。但是对于如何应对内存越界,有一些小经验。

  例如memcpy函数

  void*memcpy(void*destination,const void*source,size_t num);

  就是容易发生越界的一个经典函数,刚开始做后台的几年里面因为这个函数出现的内存问题次数不少,但是后来发现可以用C++的方法来改造它。

  总结了一下实际memcpy函数使用主要有两种场景,一是对于结构体的拷贝,二是对于char类型的数组的拷贝。先说结构体的拷贝,对于Struct A{....};A a,b;如果要把b的内容拷贝到a,有两种方法:

  memcpy(&a,&b,sizeof(a));或者:a=b;前面一种方法容易出错,改成后面一种。(a=b这种赋值拷贝的方法在C里面也是可以的,不能算是C++的改进,感谢miloyip指正)。

  memcpy函数需要使用的第二种场景,是将结构体拷贝到一个buffer中,类似这样:

  char buff[N];memcpy(buff,&a,sizeof(a));

  这个当然也不是类型安全的,容易出问题,用C++的方法可以这样改造:

  template<size_t N,class A>void memcpy_safe(char(&arr)[N],const A*p){static_assert(sizeof(A)<=N,"error blabla");::memcpy(arr,p,sizeof(A));}

  然后调用memcpy_safe(buff,&a)就安全了。

  当然这里有个问题,就是拷贝的目标地址buff,必须声明为char buff[N]的形式,不能直接用char buff=new char[N]的形式,需要动态创建buffer的时候可以将buff封装在结构体里面,如:struct buffer_type{...;size_t length;char buff[MAX_LEN];};然后buffer_type*p=new buffer_type;memcpy_safe(p->buff,&a);我们后台代码中类似用法已经全部改掉了。同理把snprintf之类的函数也全部用C++的方法封一遍,常见的内存问题都解决了。这些年我带的项目运营事故越来越少了,慢慢地在老大心中形成了一种口碑。

  C与C++"真正"的区别在哪里?因为大家都已经回答了很多了,我提供一个比较感性的答案。在我看来,我觉得C就像一片充满荆棘的沼泽地,各种坑无处不在;而C++呢,就像是一座高山,C有的坑它都有,而且增加了无数新坑,但它还是竭尽所能地提供了一条安全上山的道路,想要冒险的时候可以去路边的丛林里玩耍,需要在工程中应用的时候又可以回到路上,工作娱乐两不误。


领取试听课
温馨提示:为不影响您的学业,来校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
版权所有:搜学搜课(www.soxsok.com) 技术支持:搜学搜课网