Java 程序员开始使用 C++的 7 个快速技巧
Java 程序员开始使用 C++的 7 个快速技巧
原文:https://medium.com/hackernoon/7-quick-tips-for-java-programmers-starting-c-67103c8f3bd1

Photo by fireskystudios.com on Unsplash
1.避免使用新关键字
在 Java 中,对象是使用new关键字实例化的,因此很自然地认为我们应该以同样的方式在 C++中使用new:
Java
C++
然而,与 Java 不同,用new实例化的 C++变量是非托管的,这意味着你必须记住在使用后释放内存。
C++
这可以用delete关键字来完成。从 Java 世界来看,这看起来最不方便,最糟糕的是非常容易出错!为什么 C++版本需要额外的语句,而 Java 版本是如此简洁?
在 C++中,有多种方法可以实例化一个对象,首选的方法是直接在堆栈上。
C++
当变量被分配到堆栈上时,一旦它们超出范围,就会被自动删除。这非常简洁,并且具有很大的性能特征。
2.C++的const比 Java 的final更强大
设计大型应用程序时的一个常见模式是使值不可变。这通过减少应用程序的活动部件的数量来降低复杂性。
在 Java 中,我们可以使用final关键字将引用标记为不可变的。但是,指向的数据可能会发生变化。例如:
Java
因此,为了创建真正不可变的类型,Java 开发人员必须将类中的所有字段标记为final:
Java
Java
在 C++中,我们有const关键字,它要强大得多。如果一个实例被标记为const,那么它的任何成员都不能改变,即使它们在类定义中没有被标记为const!
C++
C++
3.当心栈切片!
在 Java 中,所有对象的语义都是它们在堆上(由于 JVM 所做的优化,现实要复杂一些,但这是一个很好的基本理解)。
C++非常不同,因为它允许用户决定对象应该放在堆上还是堆栈上。一般来说,我们应该更喜欢堆栈。它给出了可预测的(和快速的!)性能,但是它有一个很大的局限性,因为每个变量的大小在编译时必须是已知的。这是使用继承时的一个大问题。
C++
在这个例子中,我们有两个类A和B,其中B是A的子类。每个都有一个返回类名的函数what。
给定这些定义,你认为下面会做什么?
C++
如果您来自 Java 世界,答案可能会让您大吃一惊!原来当y被强制转换为类型A并赋值给z时,它采用了类A的what方法。
在 C++中,当一个堆栈变量被赋给一个超类时,它会获取该超类的成员和方法实现。这是因为变量值的大小不能超过其类型的大小。对于栈变量,编译器只是“切片”掉子类的额外信息。
为了防止这种情况,变量可以由指向。一个指针(或引用 ))) 总是有相同的大小,不管被指向的值的大小。
C++
快速旁白:value_ptr
我们发布了一个名为value_ptr的新智能指针,使得在堆上保存值语义变得更加容易。参见:
TL;速度三角形定位法(dead reckoning)
hackernoon.com](https://hackernoon.com/value-ptr-the-missing-c-smart-pointer-1f515664153e)
4.过载你的操作员!
Java 不允许你定义类似于int和boolean的自定义值类型和操作符。因此,向量和矩阵的实现可能相当麻烦!
Java
Java
在 C++中,我们可以重载+操作符:
C++
这使得矢量可以和+一起使用,就像内置的原语一样。
C++
5.利用编译时编程
Java 的泛型非常简单,大部分只对集合类型有用。C++模板极大地扩展了编译时编程的可能性,在某些方面更类似于 Java 的注释。
回忆一下我们之前的Vector2课。如果我们想用 Java 实现一个三维版本,那么我们需要创建一个新的类:
Java
在 C++中,我们可以将它作为类型的一个参数,并编写只处理一次所有大小的通用代码!代码是在编译时生成的,因此通用代码的效率不亚于手写代码。
C++
有了这个通用定义,我们可以很容易地创建任意长度的向量:
C++
模板甚至可以加快编译速度!请看下面我们的对比:
TL;速度三角形定位法(dead reckoning)
hackernoon.com](https://hackernoon.com/comparing-the-compilation-times-of-templates-and-macros-d0a1b7264a17)
6.使用 auto!
Java 著名的缺少一个可变类型推理关键字,比如auto (C++)、var (C#)、val (Kotlin)或者let (OCaml)。这可能会使 Java 代码变得非常冗长,特别是当像SimpleBeanFactoryAwareAspectInstanceFactory这样的类处于混乱状态时!
有了 C++,编译器可以为你找出许多类型,节省你一些打字和使代码更可读。
C++
7.准备使用更多的库
不管是好是坏,JVM 为您提供了许多现成的平台抽象。相比之下,C++非常精简。它缺乏对文件系统、网络和图形的内置支持。相反,C++开发人员必须利用库来实现这一功能。
一个好的库也会抽象平台差异,给出一组通用的可移植函数,就像 Java 一样。严格来说,这两种方法都不更好。Java 开发人员受益于更加统一的生态系统,因为每个人都在使用相同的底层 API。C++开发人员不再受他们不需要的功能的束缚,但他们也必须对使用什么做出更多的决定,并花费更多的时间来集成它。参见:
[## C++依赖管理的方法,或者我们为什么要建立 Buckaroo
C++是一种不寻常的语言,因为它还没有一个占主导地位的包管理器(我们正在努力!).结果是…
hackernoon.com](https://hackernoon.com/approaches-to-c-dependency-management-or-why-we-built-buckaroo-26049d4646e7)
牛仔
我们创建了 Buckaroo 来使集成 C++库变得更容易。如果你想尝试一下,最好从文档开始。您可以在 Buckaroo.pm 上浏览现有套餐,或者在愿望清单上请求更多套餐。