一、从Java、C#到C++ (为什么C++比较难)

本文探讨了C++与Java、C#的对比,指出C++的灵活性和强大性源于其特性如操作符重载、拷贝控制、指针与引用等,但也带来了开发效率低和易错性的问题。C++的多态性仅在引用和指针中体现,接口和多重继承、内存管理等增加了学习和使用的难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  由于C++已经遗忘得差不多了,我翻起了最新初版的C++ Primer,打算深入了解一下C++这一门语言。C++ Primer第五版可谓是“重构”过的,融合了C++11的标准,并将它们全部在书中列举了出来。

  在学习的过程中,我会把C++与Java、C#等纯面向对象的语言进行对比,中间的一些感悟,仅仅代表个人的意见,其中有对有错,也可能会存在一些争议。

  差不多翻完了整本Primer C++,并了解完C++11标准后,我有了如下感慨:C++是一门灵活、强大、效率低下的语言。

  所谓的“灵活”、“强大”,是指与Java、C#相比,而“效率低下”是指相对于C#、Java的开发效率,而不是程序的运行效率。同时,C++“约定俗成”了许多规则,这些规则难以全部记下来,因此在编程的时候手边最好有一本C++的手册。

  我列举几个C++灵活的地方:

  1、操作符重载,拷贝控制,隐式转换等

  在C++中,几乎所有的操作都可以被重载,例如+、-、new、delete等,哪怕你使用=赋值,其实都是在运行一个函数。如果你没有定义这样的函数,则编译器会使用它的合成版本(也就是默认版本)。默认版本的拷贝其实就是把成员的值拷贝,如果成员是一个指针,则仅仅拷贝地址。举例说明,如果有一个A类的实例a,成员中含有一个指针ptr,当用默认版本进行拷贝后,如A b = a;,那么b和a中的ptr指向的是同一个地址,如果a、b其中之一,ptr所指向的对象被析构了,那么当析构另外一个对象的时候就会发生错误(C++ Primer 第五版,P447),所以,需要析构的对象也需要一个拷贝和赋值的操作。

  上述的例子说明了,作为类的设计者,你必须要把所有的情况考虑清楚,要对它的内存分配了如指掌,否则你设计出来的类很可能会有问题。

  另一个例子是隐式转换,诸如std::string str = "hello",它把C风格的const char*转换为了std::string,这种转换在我们的理解中是很直接的,但是有时候,这种转换不仅难以理解,还会造成二义性导致编译无法通过。

  在我看来,操作符的重载对于一门语言不是必要的。在C++中我们可以轻易地想到两个std::string相加相当于连接两个字符串,而在Java、C#中,是禁止重载运算符的(C#中有个例外,就是它默认重载了String类的+),原因我猜想可能是防止程序结构太过于混乱。事实上ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值