C和CPP的区别 & C++,Java and Python的区别

今天在论坛上看到两个学神讨论C++的优劣性引申出来的各种问题,深深感觉自己差距很大,现就部分问题做个小的总结。

C和CPP的区别:

1. C没有bool类型。布尔类型是int。0是假,非0是真。 
  
2. C里字符常量(如'a'、'\n'、'\0'等)是int型,而C++里是char型。但这不影响使用。 
  
3. 没有引用类型的变量,一般使用指针。函数的参数也不能是引用类型,想要副作用请用指针。 
  
4. 没有模版。可以用宏代替。但是C99开始支持inline,用法和C++一样。 (C99 is an informal name of ISO/IEC 9899:1999, a past version of the C programming language standard)
  
5. 结构的类型是struct xxx,而不是xxx。如果你定义struct foo {int bar}; 那么你应该用sruct foo foo1;来创建变量foo1,而不是用C++的语法foo foo1;。如果愿意,你可以typedef一下。typedef struct foo foo_t; foo_t foo1;。 
  
6. 没有运行时类型机制,没有typeinfo,没有dynamic_cast。你自己知道对象是什么类型 
你可以把类型编码到对象里面。 
  
一般用tagged union思路:struct Value {int tag; union {int i; double d;} val;};,自己用tag标记是什么类型。 
  
也可以将一个公共的struct作为头;struct Animal {int kind}; struct Cat { struct Animal header; int extra_field;}; 
  
7. 没有面向对象编程。你需要自己实现多态。一般用函数指针。struct Animal {void (*speak)();}; 或者让对象指向一个虚函数表,避免每个对象里存大量的指针,但每次调用虚函数都会多一次内存访问。struct AnimalFuncs { void (*speak)()} cat_funcs, dog_funcs; struct Animal { struct AnimalFuncs funcs;}; struct Cat { struct Animal header; } cat1; ((struct Animal*)(&cat1))->funcs = cat_funcs; 所以,调用一次虚函数要访问多少次内存,你永远知道。 
  
8. 没有namespace,你要自己在函数前面加前缀,以避免冲突。 
  
*想一想,如果C++使用了namespace,那么编译出来的可执行文件里,符号表(函数名对应函数位置的表)中某个函数的名字应该怎么写(这可是关系到链接的时候能不能找到这个函数哦)?可能不同的namespace里有重名的函数,同一个也有重载的同名函数。就是这个简单的“符号表怎么写”的问题就够c++程序员折腾的。[二进制兼容性问题,C++的硬伤] 

*二进制兼容性 Application Binary Interface Transition(ABI Transition), 简单的说就是当程序已经编译完成产生了一个二进制文件,编译过程中依赖的某些头文件或者库文件,当这些文件发生更新升级时,二进制还能否正常运行?这里指的是动态库连接的二进制文件。
  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值