为什么C++析构器采用~classname语法?Bjarne的原始设计考量是什么?
为什么Bjarne Stroustrup选
~classname当析构器语法? Bjarne当初设计C++析构器语法时,主要是这几个考虑:
- 和构造器对称好理解:构造器是直接用类名(比如
MyClass()),析构器用~MyClass(),一眼就能看出来是"反向"构造,对应销毁操作,学起来不用费脑子。毕竟那时候C++刚从C扩展出来,得让熟悉C的开发者快速接受面向对象的东西,对称的语法太重要了。 - 早期根本没显式调用的需求:刚有C++的时候,没人会手动调用析构器——栈上的对象出了作用域自动销毁,堆上的用
delete也会自动触发析构。那时候哪能想到后来泛型编程会这么火,需要在模板里处理各种未知类型的对象,显式写类名的问题在当时完全不是事儿。 - 编译器好实现:早年的编译器技术没现在这么强,
~classname这种绑定类名的语法,编译器直接就能找到对应的析构函数,不用搞复杂的类型推导,能更快把C++做出来推向市场。
后来C++17加std::destroy_at,是因为泛型用多了,模板里不知道具体类型,手动写obj.~T()既麻烦又容易出错,封装成std::destroy_at(&obj)就方便多了。但回到最初的设计,~classname在当时的环境下绝对是最合理的选择。
内容的提问来源于stack exchange,提问作者Blackteahamburger
相关产品推荐
相关产品推荐

