现代c++编程c++11/14/17/20:Chapter 01: Towards Modern C++

"本文讨论了C++中的废弃特性,如不再推荐使用的字符串常量分配给char*,异常处理方式,auto_ptr等,并建议使用更新的替代方案。同时,强调了C++与C的兼容性问题,提醒开发者在编写C++时避免使用C风格的特性,并介绍了extern"C"用于链接C代码的方法。"
摘要由CSDN通过智能技术生成

1.1 Deprecated Features

Deprecation并不是完全不可用的,它只是暗示一些特性将从未来的标准中消失,应该避免使用。然而,不赞成使用的特性仍然是标准库的一部分,而且大多数特性实际上是“永久”保留的,这是出于兼容性的原因。

如果你从未使用或听说过下面的一些标准,请不要试图去理解它们。您应该直接学习新特性

  • 字符串常量不再允许分配给char *。如果您需要用一个字符串常量来分配和初始化一个char *,您应该使用const char *或auto。

      char *str = "hello world!"; // A deprecation warning will appear
    
  • c++ 98异常描述、beforeted_handler、set_unexpected()和其他相关特性不推荐使用,应该使用noexcept。

  • auto_ptr不使用,应该使用unique_ptr。

  • register关键字已被弃用,可以使用,但不再具有任何实际意义。

  • bool类型的++操作弃用

  • 如果某个类有析构函数,那么这个类为其生成复制构造函数和复制赋值操作符的特性不赞成使用。(临时类瓜皮了???)

  • 弃用C语言风格类型转换(即使用(convert_type))变量之前, 而应该用static_cast reinterpret_cast, const_cast来类型转换。

  • 特别是一些C标准库中弃用,可以使用最新的c++ 17标准,如< ccomplex >, < cstdalign >, < cstdbool >和< ctgmath >

  • ……其他

还有其他一些特性,如参数绑定(c++ 11提供了std::bind和std::function)、export 等,也不推荐使用。

1.2 Compatibilities with C

由于一些不可抗力和历史原因,我们不得不在c++中使用一些C代码(甚至是旧的C代码),例如Linux系统调用。在现代c++出现之前,大多数人都在谈论“C和c++之间的区别”。一般来说,除了回答泛型编程的面向对象类特性和模板特性之外,没有其他的意见,甚至没有直接的答案。“差不多”也是很多人。图1.2中的维恩图大致回答了C和c++相关兼容性的问题。
在这里插入图片描述
从现在开始,你的脑海中应该有这样的想法:“c++不是C的超集”(而不是从一开始,在后面参考进一步阅读给出了c++ 98和C99之间的区别)。在编写c++时,你也应该尽可能避免使用像void*这样的程序风格。当你必须使用C时,你应该注意extern “C”,将C语言代码从c++代码中分离出来,然后统一链接:

// foo.h
#ifdef __cplusplus
extern "C" {
#endif
int add(int x, int y);
#ifdef __cplusplus
}
#endif
// foo.c
int add(int x, int y) {
return x+y;
}
// 1.1.cpp
#include "foo.h"
#include <iostream>
#include <functional>

int main() {
	[out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){
		out.get() << ".\n";
	}();
	
	return 0;
}

上述代码分别用gcc和c++编译器来编译,然后统一链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值