参加工作7年了,作为一个全栈码农,工作中C++、Java、Python、Lua甚至前端Javascript都有涉及,但是自己私下都是用C/C++做项目(包括个人网站后台都是用C++开发的)。
在我的技术认知范围内C/C++能完成一切任务,我偏执地用C++实现个人笔记网站(https://www.winfengtech.com),甚至开发了一个cppshell将C/C++当作脚本语言来使用,言归正传,下面单纯从语言层面说一说我为什么使用C++。
无运行环境的拖累
在运行Java、Python等应用前你需要安装对应的运行环境或虚拟机,然而常见操作系统自带C/C++运行环境,你可以发布C/C++程序给小白用户使用,这也是桌面应大多用C++开发的原因之一。
直接调用操作系统原生API
操作系统都提供原生C语言API,在C++中你可以直接调用这些API函数。你也可以用C++的抽象能力实现类库的核心功能,然后提供C语言接口编译成动态库方便Java、Python、Lua等语言调用。
析构函数精确控制成员的生命周期
比如说一个对象打开了一个文件,可以在对象的析构函数中关闭这个文件,这样就将文件的生命周期与对象生命周期绑定,我们不用显式调用文件的close方法,从而达到对象销毁时自动关闭文件的目的,C++中的std::lock_guard类在管理锁资源时有异曲同工之妙。
魔性的运算符重载
忘记compareTo吧,在C++中你是这样比较字符串大小的。
string a = "cba";
string b = "nba";
if (a > b) puts("a>b");
高效简单地在栈上创建对象
得益于廉洁的内存,现在程序一般有大几MB甚至上十MB的线程栈空间,一般类对象占用内存大小不会超过1K,所以在C++中你可放心在栈上创建小对象与数组,就像下面这个样子。
char arr[100000]; //你没看错,数组长度是10万,没有任何问题
图灵完备的模板元编程
c++的模板元编程能力能在编译期间实现所有算法,下面代码在编译期间计算阶乘。
template <int N> struct fact
{
const static int value = N * fact<N-1>::value;
};
template <> struct fact<1>
{
const static int value = 1;
};
//请注意:我是编译期间计算的常量
const static int val = fact<5>::value;
包容一切的function对象
c++11的function对象可以保存函数指针、函数对象、lambada表达式等一切可执行对象,大大方便在接口函数中传入回调方法。
万金油般的auto关键字
C++11拓展了auto关键字的功能,你可以用auto关键字定义变量保存一切函数返回值,而不丢失任何类型信息。是的,Java可以用Object类型保存任何类对象,但Object会丢失原始类型信息,你需要用强制类型转换来恢复原始类型。
vector<int> vec = {1, 2, 3, 4, 5, 6};
for (auto val : vec)
{
cout << val << endl;
}
auto it = vec.begin();
while (it != vec.end)
{
cout << *it << endl;
}
强大的宏定义与预处理
C/C++没有定义跨平台ABI,但完全可以通过宏定义控制编译行为,实现源码级别的跨平台。可参考跨平台设置终端颜色的示例代码:https://www.winfengtech.com/compile?path=/app/compile/pub/textcolor.cpp;不仅如此,C/C++编译器还预定义以下宏,用来方便排定位代码。
__FILE__表示当前文件路径
__LINE__表示当前代码行号
__TIME__表示最近编译时间
__DATE__表示最近编译日期
你可以用__DATE__与__TIME__宏来标识程序版本,用__FILE__与__LINE__定位源码位置,在Python、Java中你可能需要借助异常捕获来定位源码文件与行号。
C/C++包含所有面向过程与面向对象编程的完整内容,比如多重继承、运算符重载、静态绑定与动态绑定等,精简语言核心,不提供五花八门的通用类库,给程序员更大的自由度,可谓编程语言中的九阳神功,一通百通,给学习其他编程语言提供加成助力。
最后推荐一个在线C++编译器:https://www.winfengtech.com/compile